diff --git a/lib/mammoth/proc/process.cpp b/lib/mammoth/proc/process.cpp index 5c4596d..c7a79e5 100644 --- a/lib/mammoth/proc/process.cpp +++ b/lib/mammoth/proc/process.cpp @@ -103,8 +103,8 @@ uint64_t LoadElfProgram(uint64_t base, uint64_t as_cap) { } // namespace -glcr::ErrorCode SpawnProcessFromElfRegion(uint64_t program, - z_cap_t yellowstone_client) { +glcr::ErrorOr SpawnProcessFromElfRegion(uint64_t program, + z_cap_t yellowstone_client) { uint64_t proc_cap; uint64_t as_cap; uint64_t foreign_port_id; @@ -130,7 +130,9 @@ glcr::ErrorCode SpawnProcessFromElfRegion(uint64_t program, uint64_t thread_cap; RET_ERR(ZThreadCreate(proc_cap, &thread_cap)); - RET_ERR(pclient.WriteMessage(Z_INIT_SELF_PROC, proc_cap)); + uint64_t dup_proc_cap; + RET_ERR(ZCapDuplicate(proc_cap, kZionPerm_All, &dup_proc_cap)); + RET_ERR(pclient.WriteMessage(Z_INIT_SELF_PROC, dup_proc_cap)); RET_ERR(pclient.WriteMessage(Z_INIT_SELF_VMAS, as_cap)); RET_ERR(pclient.WriteMessage(Z_INIT_ENDPOINT, yellowstone_client)); @@ -139,7 +141,7 @@ glcr::ErrorCode SpawnProcessFromElfRegion(uint64_t program, #endif RET_ERR(ZThreadStart(thread_cap, entry_point, foreign_port_id, 0)); - return glcr::OK; + return proc_cap; } } // namespace mmth diff --git a/lib/mammoth/proc/process.h b/lib/mammoth/proc/process.h index 1506f4f..c5a0ef4 100644 --- a/lib/mammoth/proc/process.h +++ b/lib/mammoth/proc/process.h @@ -1,12 +1,12 @@ #pragma once -#include +#include #include #include namespace mmth { -glcr::ErrorCode SpawnProcessFromElfRegion(uint64_t program, - z_cap_t yellowstone_client); +glcr::ErrorOr SpawnProcessFromElfRegion(uint64_t program, + z_cap_t yellowstone_client); } // namespace mmth diff --git a/sys/teton/terminal.cpp b/sys/teton/terminal.cpp index b436093..fda6396 100644 --- a/sys/teton/terminal.cpp +++ b/sys/teton/terminal.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include void Terminal::HandleCharacter(char c) { @@ -68,7 +69,19 @@ void Terminal::ExecuteCommand(const glcr::String& command) { auto file = mmth::File::Open(tokens[1]); // TODO: Wait until the process exits. - mmth::SpawnProcessFromElfRegion((uint64_t)file.raw_ptr(), gInitEndpointCap); + auto error_or_cap = mmth::SpawnProcessFromElfRegion( + (uint64_t)file.raw_ptr(), gInitEndpointCap); + if (!error_or_cap.ok()) { + console_.WriteString( + glcr::StrFormat("Error: {}\n", error_or_cap.error())); + return; + } + uint64_t err_code; + check(ZProcessWait(error_or_cap.value(), &err_code)); + if (err_code != 0) { + console_.WriteString(glcr::StrFormat( + "Process Error: {}\n", static_cast(err_code))); + } } else { console_.WriteString("Unknown command: "); diff --git a/sys/yellowstone/yellowstone.cpp b/sys/yellowstone/yellowstone.cpp index d23c81a..ced7332 100644 --- a/sys/yellowstone/yellowstone.cpp +++ b/sys/yellowstone/yellowstone.cpp @@ -15,7 +15,12 @@ glcr::ErrorCode SpawnProcess(z_cap_t vmmo_cap, z_cap_t yellowstone_cap) { mmth::OwnedMemoryRegion region = mmth::OwnedMemoryRegion::FromCapability(vmmo_cap); - return mmth::SpawnProcessFromElfRegion(region.vaddr(), yellowstone_cap); + auto error_or = + mmth::SpawnProcessFromElfRegion(region.vaddr(), yellowstone_cap); + if (error_or.ok()) { + return glcr::OK; + } + return error_or.error(); } uint64_t main(uint64_t port_cap) { @@ -48,8 +53,11 @@ uint64_t main(uint64_t port_cap) { mmth::File::Open(glcr::StrFormat("/bin/{}", files[i])); ASSIGN_OR_RETURN(client_cap, server->CreateClientCap()); - check(mmth::SpawnProcessFromElfRegion((uint64_t)binary.raw_ptr(), - client_cap)); + auto error_or = mmth::SpawnProcessFromElfRegion( + (uint64_t)binary.raw_ptr(), client_cap); + if (!error_or.ok()) { + check(error_or.error()); + } } }