[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) {
|
glcr::RefPtr<Capability> CapabilityTable::GetCapability(uint64_t id) {
|
||||||
MutexHolder h(lock_);
|
MutexHolder h(lock_);
|
||||||
if (!capabilities_.Contains(id)) {
|
if (!capabilities_.Contains(id)) {
|
||||||
panic("Bad cap access {}", id);
|
dbgln("Bad cap access {}", id);
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
return capabilities_.at(id);
|
return capabilities_.at(id);
|
||||||
}
|
}
|
||||||
|
@ -25,7 +26,8 @@ glcr::RefPtr<Capability> CapabilityTable::GetCapability(uint64_t id) {
|
||||||
glcr::RefPtr<Capability> CapabilityTable::ReleaseCapability(uint64_t id) {
|
glcr::RefPtr<Capability> CapabilityTable::ReleaseCapability(uint64_t id) {
|
||||||
MutexHolder h(lock_);
|
MutexHolder h(lock_);
|
||||||
if (!capabilities_.Contains(id)) {
|
if (!capabilities_.Contains(id)) {
|
||||||
panic("Bad cap release {}", id);
|
dbgln("Bad cap release {}", id);
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
auto cap = capabilities_.at(id);
|
auto cap = capabilities_.at(id);
|
||||||
(void)capabilities_.Delete(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);
|
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);
|
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(MutexCreate, z_cap_t*, mutex_cap);
|
||||||
SYS1(MutexLock, z_cap_t, mutex_cap);
|
SYS1(MutexLock, z_cap_t, mutex_cap);
|
||||||
|
|
|
@ -53,6 +53,7 @@ const uint64_t kZionEndpointCall = 0x65;
|
||||||
|
|
||||||
// Capability Calls
|
// Capability Calls
|
||||||
const uint64_t kZionCapDuplicate = 0x70;
|
const uint64_t kZionCapDuplicate = 0x70;
|
||||||
|
const uint64_t kZionCapRelease = 0x71;
|
||||||
|
|
||||||
// Syncronization Calls
|
// Syncronization Calls
|
||||||
const uint64_t kZionMutexCreate = 0x80;
|
const uint64_t kZionMutexCreate = 0x80;
|
||||||
|
|
|
@ -18,3 +18,11 @@ z_err_t CapDuplicate(ZCapDuplicateReq* req) {
|
||||||
cap->permissions() & req->perm_mask);
|
cap->permissions() & req->perm_mask);
|
||||||
return glcr::OK;
|
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"
|
#include "include/zcall.h"
|
||||||
|
|
||||||
z_err_t CapDuplicate(ZCapDuplicateReq* req);
|
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);
|
CASE(ReplyPortRecv);
|
||||||
// syscall/capability.h
|
// syscall/capability.h
|
||||||
CASE(CapDuplicate);
|
CASE(CapDuplicate);
|
||||||
|
CASE(CapRelease);
|
||||||
// syscall/syncronization.h
|
// syscall/syncronization.h
|
||||||
CASE(MutexCreate);
|
CASE(MutexCreate);
|
||||||
CASE(MutexLock);
|
CASE(MutexLock);
|
||||||
|
|
Loading…
Reference in New Issue