diff --git a/lib/glacier/status/error_or.h b/lib/glacier/status/error_or.h index 38c00c8..cbdc158 100644 --- a/lib/glacier/status/error_or.h +++ b/lib/glacier/status/error_or.h @@ -10,6 +10,8 @@ class ErrorOr { ErrorOr() = delete; ErrorOr(const ErrorOr&) = delete; ErrorOr(ErrorOr&&) = delete; + // FIXME: Do we have to call ~T manually here. + ~ErrorOr() {} ErrorOr(ErrorCode code) : error_(code), ok_(false) {} ErrorOr(const T& obj) : obj_(obj), ok_(true) {} diff --git a/lib/mammoth/include/mammoth/process.h b/lib/mammoth/include/mammoth/process.h index 477f0fb..a331422 100644 --- a/lib/mammoth/include/mammoth/process.h +++ b/lib/mammoth/include/mammoth/process.h @@ -1,7 +1,8 @@ #pragma once +#include #include #include "mammoth/channel.h" -uint64_t SpawnProcessFromElfRegion(uint64_t program, Channel& local); +glcr::ErrorOr SpawnProcessFromElfRegion(uint64_t program); diff --git a/lib/mammoth/src/process.cpp b/lib/mammoth/src/process.cpp index e199088..068cd88 100644 --- a/lib/mammoth/src/process.cpp +++ b/lib/mammoth/src/process.cpp @@ -95,8 +95,8 @@ uint64_t LoadElfProgram(uint64_t base, uint64_t as_cap) { } // namespace -uint64_t SpawnProcessFromElfRegion(uint64_t program, Channel& local) { - Channel foreign; +glcr::ErrorOr SpawnProcessFromElfRegion(uint64_t program) { + Channel local, foreign; check(CreateChannels(local, foreign)); uint64_t proc_cap; @@ -134,5 +134,5 @@ uint64_t SpawnProcessFromElfRegion(uint64_t program, Channel& local) { #endif check(ZThreadStart(thread_cap, entry_point, foreign_port_id, 0)); - return glcr::OK; + return local; } diff --git a/sys/yellowstone/yellowstone.cpp b/sys/yellowstone/yellowstone.cpp index 1265e88..fd898a6 100644 --- a/sys/yellowstone/yellowstone.cpp +++ b/sys/yellowstone/yellowstone.cpp @@ -17,8 +17,11 @@ uint64_t main(uint64_t port_cap) { uint64_t vaddr; check(ZAddressSpaceMap(gSelfVmasCap, 0, gBootDenaliVmmoCap, &vaddr)); - Channel local; - check(SpawnProcessFromElfRegion(vaddr, local)); + auto local_or = SpawnProcessFromElfRegion(vaddr); + if (!local_or) { + check(local_or.error()); + } + Channel local = local_or.value(); DenaliClient client(local); GptReader reader(client);