[Zion] Add the ability to delete a capability.

This commit is contained in:
Drew Galbraith 2023-11-19 17:53:56 -08:00
parent 2e08eb76ff
commit 7d48dd2b8b
6 changed files with 16 additions and 2 deletions

View File

@ -17,7 +17,8 @@ uint64_t CapabilityTable::AddExistingCapability(
glcr::RefPtr<Capability> CapabilityTable::GetCapability(uint64_t id) {
MutexHolder h(lock_);
if (!capabilities_.Contains(id)) {
panic("Bad cap access {}", id);
dbgln("Bad cap access {}", id);
return {};
}
return capabilities_.at(id);
}
@ -25,7 +26,8 @@ glcr::RefPtr<Capability> CapabilityTable::GetCapability(uint64_t id) {
glcr::RefPtr<Capability> CapabilityTable::ReleaseCapability(uint64_t id) {
MutexHolder h(lock_);
if (!capabilities_.Contains(id)) {
panic("Bad cap release {}", id);
dbgln("Bad cap release {}", id);
return {};
}
auto cap = capabilities_.at(id);
(void)capabilities_.Delete(id);

View File

@ -56,6 +56,7 @@ SYS5(ReplyPortRecv, z_cap_t, reply_port_cap, uint64_t*, num_bytes, void*, data,
uint64_t*, num_caps, z_cap_t*, caps);
SYS3(CapDuplicate, z_cap_t, cap_in, z_perm_t, perm_mask, z_cap_t*, cap_out);
SYS1(CapRelease, z_cap_t, cap);
SYS1(MutexCreate, z_cap_t*, mutex_cap);
SYS1(MutexLock, z_cap_t, mutex_cap);

View File

@ -53,6 +53,7 @@ const uint64_t kZionEndpointCall = 0x65;
// Capability Calls
const uint64_t kZionCapDuplicate = 0x70;
const uint64_t kZionCapRelease = 0x71;
// Syncronization Calls
const uint64_t kZionMutexCreate = 0x80;

View File

@ -18,3 +18,11 @@ z_err_t CapDuplicate(ZCapDuplicateReq* req) {
cap->permissions() & req->perm_mask);
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;
}

View File

@ -3,3 +3,4 @@
#include "include/zcall.h"
z_err_t CapDuplicate(ZCapDuplicateReq* req);
z_err_t CapRelease(ZCapReleaseReq* req);

View File

@ -81,6 +81,7 @@ extern "C" z_err_t SyscallHandler(uint64_t call_id, void* req) {
CASE(ReplyPortRecv);
// syscall/capability.h
CASE(CapDuplicate);
CASE(CapRelease);
// syscall/syncronization.h
CASE(MutexCreate);
CASE(MutexLock);