[Zion] Add the ability to delete a capability.
This commit is contained in:
parent
2e08eb76ff
commit
7d48dd2b8b
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -3,3 +3,4 @@
|
|||
#include "include/zcall.h"
|
||||
|
||||
z_err_t CapDuplicate(ZCapDuplicateReq* req);
|
||||
z_err_t CapRelease(ZCapReleaseReq* req);
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue