[zion] Add a syscall to duplicate capabilities
This commit is contained in:
parent
378ced6b6c
commit
cc191cd6bb
|
@ -46,6 +46,9 @@
|
|||
|
||||
#define Z_IRQ_PCI_BASE 0x30
|
||||
|
||||
// Capability Calls
|
||||
#define Z_CAP_DUPLICATE 0x60
|
||||
|
||||
// Debugging Calls.
|
||||
#define Z_DEBUG_PRINT 0x10000000
|
||||
|
||||
|
@ -101,4 +104,6 @@ void ZThreadExit();
|
|||
uint64_t* actual_bytes, uint64_t* actual_caps);
|
||||
[[nodiscard]] z_err_t ZIrqRegister(uint64_t irq_num, uint64_t* port_cap);
|
||||
|
||||
[[nodiscard]] z_err_t ZCapDuplicate(uint64_t cap_in, uint64_t* cap_out);
|
||||
|
||||
[[nodiscard]] z_err_t ZDebug(const char* message);
|
||||
|
|
|
@ -239,6 +239,16 @@ z_err_t IrqRegister(ZIrqRegisterReq* req, ZIrqRegisterResp* resp) {
|
|||
return Z_OK;
|
||||
}
|
||||
|
||||
z_err_t CapDuplicate(ZCapDuplicateReq* req, ZCapDuplicateResp* resp) {
|
||||
auto& proc = gScheduler->CurrentProcess();
|
||||
auto cap = proc.GetCapability(req->cap);
|
||||
if (!cap) {
|
||||
return Z_ERR_CAP_NOT_FOUND;
|
||||
}
|
||||
resp->cap = proc.AddExistingCapability(cap);
|
||||
return Z_OK;
|
||||
}
|
||||
|
||||
extern "C" z_err_t SyscallHandler(uint64_t call_id, void* req, void* resp) {
|
||||
RefPtr<Thread> thread = gScheduler->CurrentThread();
|
||||
switch (call_id) {
|
||||
|
@ -290,6 +300,9 @@ extern "C" z_err_t SyscallHandler(uint64_t call_id, void* req, void* resp) {
|
|||
case Z_IRQ_REGISTER:
|
||||
return IrqRegister(reinterpret_cast<ZIrqRegisterReq*>(req),
|
||||
reinterpret_cast<ZIrqRegisterResp*>(resp));
|
||||
case Z_CAP_DUPLICATE:
|
||||
return CapDuplicate(reinterpret_cast<ZCapDuplicateReq*>(req),
|
||||
reinterpret_cast<ZCapDuplicateResp*>(resp));
|
||||
case Z_DEBUG_PRINT:
|
||||
dbgln("[Debug] %s", req);
|
||||
return Z_OK;
|
||||
|
|
|
@ -222,4 +222,14 @@ z_err_t ZIrqRegister(uint64_t irq_num, uint64_t* port_cap) {
|
|||
return ret;
|
||||
}
|
||||
|
||||
z_err_t ZCapDuplicate(uint64_t cap_in, uint64_t* cap_out) {
|
||||
ZCapDuplicateReq req{
|
||||
.cap = cap_in,
|
||||
};
|
||||
ZCapDuplicateResp resp;
|
||||
z_err_t ret = SysCall2(Z_CAP_DUPLICATE, &req, &resp);
|
||||
*cap_out = resp.cap;
|
||||
return ret;
|
||||
}
|
||||
|
||||
z_err_t ZDebug(const char* message) { return SysCall1(Z_DEBUG_PRINT, message); }
|
||||
|
|
|
@ -102,3 +102,11 @@ struct ZIrqRegisterReq {
|
|||
struct ZIrqRegisterResp {
|
||||
uint64_t port_cap;
|
||||
};
|
||||
|
||||
struct ZCapDuplicateReq {
|
||||
uint64_t cap;
|
||||
};
|
||||
|
||||
struct ZCapDuplicateResp {
|
||||
uint64_t cap;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue