diff --git a/zion/loader/init_loader.cpp b/zion/loader/init_loader.cpp index e85e958..3caa42c 100644 --- a/zion/loader/init_loader.cpp +++ b/zion/loader/init_loader.cpp @@ -127,7 +127,7 @@ void LoadInitProgram() { RefPtr prog2_vmmo = MakeRefCounted(prog2.size); prog2_vmmo->CopyBytesToObject(reinterpret_cast(prog2.address), prog2.size); - proc->AddCapability(Z_INIT_BOOT_VMMO, prog2_vmmo); + proc->AddNewCapabilityWithId(Z_INIT_BOOT_VMMO, prog2_vmmo, ZC_WRITE); proc->CreateThread()->Start(entry, 0, 0); } diff --git a/zion/object/channel.cpp b/zion/object/channel.cpp index b519dfa..8f19b16 100644 --- a/zion/object/channel.cpp +++ b/zion/object/channel.cpp @@ -44,7 +44,7 @@ z_err_t Channel::Read(ZMessage& msg) { msg.num_caps = next_msg->caps.size(); auto& proc = gScheduler->CurrentProcess(); for (uint64_t i = 0; i < msg.num_caps; i++) { - msg.caps[i] = proc.AddCapability(next_msg->caps.PopFront()); + msg.caps[i] = proc.AddExistingCapability(next_msg->caps.PopFront()); } pending_messages_.PopFront(); diff --git a/zion/object/process.cpp b/zion/object/process.cpp index 828d76a..0867a71 100644 --- a/zion/object/process.cpp +++ b/zion/object/process.cpp @@ -22,9 +22,9 @@ RefPtr Process::RootProcess() { } RefPtr Process::Create() { auto proc = MakeRefCounted(); - proc->caps_.AddNewCapabilityWithId(Z_INIT_PROC_SELF, proc, - ZC_PROC_SPAWN_PROC | ZC_PROC_SPAWN_THREAD); - proc->caps_.AddNewCapabilityWithId(Z_INIT_VMAS_SELF, proc->vmas(), ZC_WRITE); + proc->AddNewCapabilityWithId(Z_INIT_PROC_SELF, proc, + ZC_PROC_SPAWN_PROC | ZC_PROC_SPAWN_THREAD); + proc->AddNewCapabilityWithId(Z_INIT_VMAS_SELF, proc->vmas(), ZC_WRITE); return proc; } @@ -71,10 +71,6 @@ RefPtr Process::GetCapability(uint64_t cid) { return caps_.GetCapability(cid); } -uint64_t Process::AddCapability(const RefPtr& cap) { +uint64_t Process::AddExistingCapability(const RefPtr& cap) { return caps_.AddExistingCapability(cap); } - -void Process::AddCapability(uint64_t cap_id, const RefPtr& vmmo) { - caps_.AddNewCapabilityWithId(cap_id, vmmo, ZC_WRITE); -} diff --git a/zion/object/process.h b/zion/object/process.h index d7901b9..05fc57a 100644 --- a/zion/object/process.h +++ b/zion/object/process.h @@ -39,15 +39,19 @@ class Process : public KernelObject { RefPtr ReleaseCapability(uint64_t cid); RefPtr GetCapability(uint64_t cid); - // FIXME: We can't reset the cap id here. - uint64_t AddCapability(const RefPtr& cap); - - void AddCapability(uint64_t cap_id, const RefPtr& vmmo); template uint64_t AddNewCapability(const RefPtr& obj, uint64_t permissions) { return caps_.AddNewCapability(obj, permissions); } + uint64_t AddExistingCapability(const RefPtr& cap); + + // FIXME: Eliminate reliance on this. + template + void AddNewCapabilityWithId(uint64_t id, const RefPtr& obj, + uint64_t permissions) { + return caps_.AddNewCapabilityWithId(id, obj, permissions); + } // Checks the state of all child threads and transitions to // finished if all have finished. diff --git a/zion/syscall/syscall.cpp b/zion/syscall/syscall.cpp index bb1044d..0d2c468 100644 --- a/zion/syscall/syscall.cpp +++ b/zion/syscall/syscall.cpp @@ -81,7 +81,7 @@ z_err_t ProcessSpawn(ZProcessSpawnReq* req, ZProcessSpawnResp* resp) { return Z_ERR_CAP_NOT_FOUND; } // FIXME: Check permissions. - resp->bootstrap_cap = proc->AddCapability(cap); + resp->bootstrap_cap = proc->AddExistingCapability(cap); } return Z_OK;