From 7dcbbd671e34ca834bcd9bc730e666f7beff7a27 Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Sat, 17 Jun 2023 01:30:47 -0700 Subject: [PATCH] [denali] Get all caps from the init port. This allows us to remove the bootstrap capabilities for good woo hoo! --- lib/libc/src/malloc.cpp | 3 ++- lib/mammoth/include/mammoth/init.h | 6 +----- lib/mammoth/include/mammoth/port.h | 10 ++++++++++ lib/mammoth/src/init.cpp | 5 +++++ lib/mammoth/src/memory_region.cpp | 7 ++++--- lib/mammoth/src/process.cpp | 27 +++++++++++++++++++++------ lib/mammoth/src/thread.cpp | 3 ++- sys/denali/denali.cpp | 6 ++++-- zion/include/zglobal.h | 10 ++++++++++ zion/include/zinit.h | 5 ++--- zion/object/process.cpp | 8 +------- 11 files changed, 62 insertions(+), 28 deletions(-) create mode 100644 zion/include/zglobal.h diff --git a/lib/libc/src/malloc.cpp b/lib/libc/src/malloc.cpp index 34f0a9a..5ebbf6e 100644 --- a/lib/libc/src/malloc.cpp +++ b/lib/libc/src/malloc.cpp @@ -1,4 +1,5 @@ #include +#include #include #include "stdlib.h" @@ -15,7 +16,7 @@ class NaiveAllocator { if (err != 0) { ZProcessExit(err); } - err = ZAddressSpaceMap(Z_INIT_VMAS_SELF, 0, vmmo_cap, &next_addr_); + err = ZAddressSpaceMap(gSelfVmasCap, 0, vmmo_cap, &next_addr_); max_addr_ = next_addr_ + kSize; } diff --git a/lib/mammoth/include/mammoth/init.h b/lib/mammoth/include/mammoth/init.h index 504aa9c..1e1dbf4 100644 --- a/lib/mammoth/include/mammoth/init.h +++ b/lib/mammoth/include/mammoth/init.h @@ -2,10 +2,6 @@ #include #include - -extern uint64_t gSelfProcCap; -extern uint64_t gSelfVmasCap; - -extern uint64_t gBootDenaliVmmoCap; +#include z_err_t ParseInitPort(uint64_t init_port_cap); diff --git a/lib/mammoth/include/mammoth/port.h b/lib/mammoth/include/mammoth/port.h index ad17802..57dbf9f 100644 --- a/lib/mammoth/include/mammoth/port.h +++ b/lib/mammoth/include/mammoth/port.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include class Port { @@ -9,6 +10,15 @@ class Port { z_err_t PollForIntCap(uint64_t* msg, uint64_t* cap); + template + z_err_t WriteMessage(const T& obj, uint64_t cap); + private: uint64_t port_cap_; }; + +template +z_err_t Port::WriteMessage(const T& obj, uint64_t cap) { + return ZPortSend(port_cap_, sizeof(obj), + reinterpret_cast(&obj), 1, &cap); +} diff --git a/lib/mammoth/src/init.cpp b/lib/mammoth/src/init.cpp index 1cf193c..5937bfc 100644 --- a/lib/mammoth/src/init.cpp +++ b/lib/mammoth/src/init.cpp @@ -8,6 +8,8 @@ uint64_t gSelfProcCap = 0; uint64_t gSelfVmasCap = 0; +uint64_t gInitChannelCap = 0; + uint64_t gBootDenaliVmmoCap = 0; z_err_t ParseInitPort(uint64_t init_port_cap) { @@ -25,6 +27,9 @@ z_err_t ParseInitPort(uint64_t init_port_cap) { dbgln("received vmas"); gSelfVmasCap = init_cap; break; + case Z_INIT_CHANNEL: + gInitChannelCap = init_cap; + break; case Z_BOOT_DENALI_VMMO: dbgln("received denali"); gBootDenaliVmmoCap = init_cap; diff --git a/lib/mammoth/src/memory_region.cpp b/lib/mammoth/src/memory_region.cpp index d4ed635..03e9c2e 100644 --- a/lib/mammoth/src/memory_region.cpp +++ b/lib/mammoth/src/memory_region.cpp @@ -4,6 +4,7 @@ #include #include "mammoth/debug.h" +#include "mammoth/init.h" MappedMemoryRegion MappedMemoryRegion::DirectPhysical(uint64_t paddr, uint64_t size) { @@ -11,7 +12,7 @@ MappedMemoryRegion MappedMemoryRegion::DirectPhysical(uint64_t paddr, check(ZMemoryObjectCreatePhysical(paddr, size, &vmmo_cap)); uint64_t vaddr; - check(ZAddressSpaceMap(Z_INIT_VMAS_SELF, 0, vmmo_cap, &vaddr)); + check(ZAddressSpaceMap(gSelfVmasCap, 0, vmmo_cap, &vaddr)); return MappedMemoryRegion(vmmo_cap, paddr, vaddr, size); } @@ -21,7 +22,7 @@ MappedMemoryRegion MappedMemoryRegion::ContiguousPhysical(uint64_t size) { check(ZMemoryObjectCreateContiguous(size, &vmmo_cap, &paddr)); uint64_t vaddr; - check(ZAddressSpaceMap(Z_INIT_VMAS_SELF, 0, vmmo_cap, &vaddr)); + check(ZAddressSpaceMap(gSelfVmasCap, 0, vmmo_cap, &vaddr)); return MappedMemoryRegion(vmmo_cap, paddr, vaddr, size); } @@ -31,7 +32,7 @@ MappedMemoryRegion MappedMemoryRegion::Default(uint64_t size) { check(ZMemoryObjectCreate(size, &vmmo_cap)); uint64_t vaddr; - check(ZAddressSpaceMap(Z_INIT_VMAS_SELF, 0, vmmo_cap, &vaddr)); + check(ZAddressSpaceMap(gSelfVmasCap, 0, vmmo_cap, &vaddr)); return MappedMemoryRegion(vmmo_cap, 0, vaddr, size); } diff --git a/lib/mammoth/src/process.cpp b/lib/mammoth/src/process.cpp index 326b87e..778aca3 100644 --- a/lib/mammoth/src/process.cpp +++ b/lib/mammoth/src/process.cpp @@ -7,6 +7,7 @@ #include "mammoth/channel.h" #include "mammoth/debug.h" #include "mammoth/init.h" +#include "mammoth/port.h" #define MAM_PROC_DEBUG 0 @@ -99,26 +100,40 @@ uint64_t SpawnProcessFromElfRegion(uint64_t program, Channel& local) { Channel foreign; check(CreateChannels(local, foreign)); + uint64_t proc_cap; + uint64_t as_cap; + uint64_t foreign_port_id; + uint64_t port_cap; +#if MAM_PROC_DEBUG + dbgln("Port Create"); +#endif + check(ZPortCreate(&port_cap)); + uint64_t port_cap_donate; + check(ZCapDuplicate(port_cap, &port_cap_donate)); + #if MAM_PROC_DEBUG dbgln("Spawn"); #endif - uint64_t proc_cap; - uint64_t as_cap; - uint64_t foreign_chan_id; - check(ZProcessSpawn(gSelfProcCap, foreign.release_cap(), &proc_cap, &as_cap, - &foreign_chan_id)); + check(ZProcessSpawn(gSelfProcCap, port_cap_donate, &proc_cap, &as_cap, + &foreign_port_id)); uint64_t entry_point = LoadElfProgram(program, as_cap); + #if MAM_PROC_DEBUG dbgln("Thread Create"); #endif uint64_t thread_cap; check(ZThreadCreate(proc_cap, &thread_cap)); + Port p(port_cap); + check(p.WriteMessage(Z_INIT_SELF_PROC, proc_cap)); + check(p.WriteMessage(Z_INIT_SELF_VMAS, as_cap)); + check(p.WriteMessage(Z_INIT_CHANNEL, foreign.release_cap())); + #if MAM_PROC_DEBUG dbgln("Thread start"); #endif - check(ZThreadStart(thread_cap, entry_point, foreign_chan_id, 0)); + check(ZThreadStart(thread_cap, entry_point, foreign_port_id, 0)); return Z_OK; } diff --git a/lib/mammoth/src/thread.cpp b/lib/mammoth/src/thread.cpp index 56095dd..cb047ba 100644 --- a/lib/mammoth/src/thread.cpp +++ b/lib/mammoth/src/thread.cpp @@ -4,6 +4,7 @@ #include #include "mammoth/debug.h" +#include "mammoth/init.h" namespace { @@ -16,7 +17,7 @@ extern "C" void thread_entry(Thread::Entry entry, void* arg1) { } // namespace Thread::Thread(Entry e, const void* arg1) { - check(ZThreadCreate(Z_INIT_PROC_SELF, &thread_cap_)); + check(ZThreadCreate(gSelfProcCap, &thread_cap_)); check(ZThreadStart(thread_cap_, reinterpret_cast(thread_entry), reinterpret_cast(e), reinterpret_cast(arg1))); diff --git a/sys/denali/denali.cpp b/sys/denali/denali.cpp index cc5066c..e750472 100644 --- a/sys/denali/denali.cpp +++ b/sys/denali/denali.cpp @@ -1,15 +1,17 @@ #include #include +#include #include #include "ahci/ahci_driver.h" #include "denali_server.h" -int main(uint64_t bootstrap_cap) { +uint64_t main(uint64_t init_port_cap) { + check(ParseInitPort(init_port_cap)); AhciDriver driver; RET_ERR(driver.Init()); - DenaliServer server(bootstrap_cap, driver); + DenaliServer server(gInitChannelCap, driver); RET_ERR(server.RunServer()); // FIXME: Add thread join. return 0; diff --git a/zion/include/zglobal.h b/zion/include/zglobal.h new file mode 100644 index 0000000..abe88a2 --- /dev/null +++ b/zion/include/zglobal.h @@ -0,0 +1,10 @@ +#pragma once + +#include + +extern uint64_t gSelfProcCap; +extern uint64_t gSelfVmasCap; + +extern uint64_t gInitChannelCap; + +extern uint64_t gBootDenaliVmmoCap; diff --git a/zion/include/zinit.h b/zion/include/zinit.h index a59c792..46acf6e 100644 --- a/zion/include/zinit.h +++ b/zion/include/zinit.h @@ -1,9 +1,8 @@ #pragma once -#define Z_INIT_PROC_SELF 0x00 -#define Z_INIT_VMAS_SELF 0x01 - #define Z_INIT_SELF_PROC 0x100 #define Z_INIT_SELF_VMAS 0x101 +#define Z_INIT_CHANNEL 0x200 + #define Z_BOOT_DENALI_VMMO 0x1000 diff --git a/zion/object/process.cpp b/zion/object/process.cpp index dc8bdaf..739e11b 100644 --- a/zion/object/process.cpp +++ b/zion/object/process.cpp @@ -21,13 +21,7 @@ RefPtr Process::RootProcess() { return proc; } -RefPtr Process::Create() { - auto proc = MakeRefCounted(); - 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; -} +RefPtr Process::Create() { return MakeRefCounted(); } Process::Process() : id_(gNextId++), vmas_(MakeRefCounted()), state_(RUNNING) {}