From 528723e490de3eb61f5553b51155d008be15b650 Mon Sep 17 00:00:00 2001 From: Drew Galbraith Date: Fri, 16 Jun 2023 23:51:49 -0700 Subject: [PATCH] [mammoth] Create a method for getting initial caps. --- lib/libc/src/malloc.cpp | 1 + lib/mammoth/CMakeLists.txt | 2 ++ lib/mammoth/include/mammoth/init.h | 11 +++++++++ lib/mammoth/include/mammoth/port.h | 14 +++++++++++ lib/mammoth/src/init.cpp | 38 ++++++++++++++++++++++++++++++ lib/mammoth/src/memory_region.cpp | 1 + lib/mammoth/src/port.cpp | 22 +++++++++++++++++ lib/mammoth/src/process.cpp | 1 + lib/mammoth/src/thread.cpp | 1 + sys/yellowstone/hw/pcie.cpp | 1 + sys/yellowstone/yellowstone.cpp | 20 +++++----------- zion/include/zcall.h | 6 ----- zion/include/zinit.h | 6 +++++ zion/loader/init_loader.cpp | 5 ++-- zion/object/process.cpp | 1 + 15 files changed, 108 insertions(+), 22 deletions(-) create mode 100644 lib/mammoth/include/mammoth/init.h create mode 100644 lib/mammoth/include/mammoth/port.h create mode 100644 lib/mammoth/src/init.cpp create mode 100644 lib/mammoth/src/port.cpp create mode 100644 zion/include/zinit.h diff --git a/lib/libc/src/malloc.cpp b/lib/libc/src/malloc.cpp index fc8393c..34f0a9a 100644 --- a/lib/libc/src/malloc.cpp +++ b/lib/libc/src/malloc.cpp @@ -1,4 +1,5 @@ #include +#include #include "stdlib.h" diff --git a/lib/mammoth/CMakeLists.txt b/lib/mammoth/CMakeLists.txt index 7908dce..f3d2c33 100644 --- a/lib/mammoth/CMakeLists.txt +++ b/lib/mammoth/CMakeLists.txt @@ -1,8 +1,10 @@ add_library(mammoth_lib STATIC src/channel.cpp src/debug.cpp + src/init.cpp src/memory_region.cpp src/process.cpp + src/port.cpp src/thread.cpp ) diff --git a/lib/mammoth/include/mammoth/init.h b/lib/mammoth/include/mammoth/init.h new file mode 100644 index 0000000..504aa9c --- /dev/null +++ b/lib/mammoth/include/mammoth/init.h @@ -0,0 +1,11 @@ +#pragma once + +#include +#include + +extern uint64_t gSelfProcCap; +extern uint64_t gSelfVmasCap; + +extern uint64_t gBootDenaliVmmoCap; + +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 new file mode 100644 index 0000000..ad17802 --- /dev/null +++ b/lib/mammoth/include/mammoth/port.h @@ -0,0 +1,14 @@ +#pragma once + +#include +#include + +class Port { + public: + Port(uint64_t port_cap); + + z_err_t PollForIntCap(uint64_t* msg, uint64_t* cap); + + private: + uint64_t port_cap_; +}; diff --git a/lib/mammoth/src/init.cpp b/lib/mammoth/src/init.cpp new file mode 100644 index 0000000..9fb3cf8 --- /dev/null +++ b/lib/mammoth/src/init.cpp @@ -0,0 +1,38 @@ +#include "mammoth/init.h" + +#include + +#include "mammoth/debug.h" +#include "mammoth/port.h" + +uint64_t gSelfProcCap = 0; +uint64_t gSelfVmasCap = 0; + +uint64_t gBootDenaliVmmoCap = 0; + +z_err_t ParseInitPort(uint64_t init_port_cap) { + Port port(init_port_cap); + z_err_t ret; + uint64_t init_sig, init_cap; + while ((ret = port.PollForIntCap(&init_sig, &init_cap)) != Z_ERR_EMPTY) { + RET_ERR(ret); + switch (init_sig) { + case Z_INIT_PROC_SELF: + dbgln("received proc"); + gSelfProcCap = init_cap; + break; + case Z_INIT_VMAS_SELF: + dbgln("received vmas"); + gSelfVmasCap = init_cap; + break; + case Z_BOOT_DENALI_VMMO: + dbgln("received denali"); + gBootDenaliVmmoCap = init_cap; + break; + default: + dbgln("Unexpected init type %x, continuing.", init_sig); + } + } + + return Z_OK; +} diff --git a/lib/mammoth/src/memory_region.cpp b/lib/mammoth/src/memory_region.cpp index 8420297..d4ed635 100644 --- a/lib/mammoth/src/memory_region.cpp +++ b/lib/mammoth/src/memory_region.cpp @@ -1,6 +1,7 @@ #include "mammoth/memory_region.h" #include +#include #include "mammoth/debug.h" diff --git a/lib/mammoth/src/port.cpp b/lib/mammoth/src/port.cpp new file mode 100644 index 0000000..4224a4b --- /dev/null +++ b/lib/mammoth/src/port.cpp @@ -0,0 +1,22 @@ +#include "mammoth/port.h" + +#include + +#include "mammoth/debug.h" + +Port::Port(uint64_t port_cap) : port_cap_(port_cap) {} + +z_err_t Port::PollForIntCap(uint64_t *msg, uint64_t *cap) { + uint64_t bytes, caps, type; + RET_ERR(ZPortPoll(port_cap_, sizeof(uint64_t), + reinterpret_cast(msg), /* num_caps= */ 1, cap, + &type, &bytes, &caps)); + + if (bytes != sizeof(uint64_t)) { + return Z_ERR_INVALID; + } + if (caps != 1) { + return Z_ERR_INVALID; + } + return Z_OK; +} diff --git a/lib/mammoth/src/process.cpp b/lib/mammoth/src/process.cpp index 4232ce3..13be100 100644 --- a/lib/mammoth/src/process.cpp +++ b/lib/mammoth/src/process.cpp @@ -2,6 +2,7 @@ #include #include +#include #include "mammoth/channel.h" #include "mammoth/debug.h" diff --git a/lib/mammoth/src/thread.cpp b/lib/mammoth/src/thread.cpp index c0a38b3..56095dd 100644 --- a/lib/mammoth/src/thread.cpp +++ b/lib/mammoth/src/thread.cpp @@ -1,6 +1,7 @@ #include "mammoth/thread.h" #include +#include #include "mammoth/debug.h" diff --git a/sys/yellowstone/hw/pcie.cpp b/sys/yellowstone/hw/pcie.cpp index 45286fa..d399ffa 100644 --- a/sys/yellowstone/hw/pcie.cpp +++ b/sys/yellowstone/hw/pcie.cpp @@ -2,6 +2,7 @@ #include #include +#include namespace { diff --git a/sys/yellowstone/yellowstone.cpp b/sys/yellowstone/yellowstone.cpp index 7914917..3d1470e 100644 --- a/sys/yellowstone/yellowstone.cpp +++ b/sys/yellowstone/yellowstone.cpp @@ -1,27 +1,19 @@ #include #include #include +#include #include #include +#include #include "hw/pcie.h" uint64_t main(uint64_t port_cap) { dbgln("Yellowstone Initializing."); - uint64_t msg_type, type, cap, bytes, caps; - check(ZPortRecv(port_cap, 8, reinterpret_cast(&msg_type), 1, &cap, - &type, &bytes, &caps)); - uint64_t vmmo_cap = 0; - if (bytes != 8 || caps != 1) { - crash("Invalid boot msg", Z_ERR_INVALID); - } - if (msg_type == Z_INIT_BOOT_VMMO) { - vmmo_cap = cap; - } else { - crash("Missing vmmo cap", Z_ERR_UNIMPLEMENTED); - } + check(ParseInitPort(port_cap)); + uint64_t vaddr; - check(ZAddressSpaceMap(Z_INIT_VMAS_SELF, 0, vmmo_cap, &vaddr)); + check(ZAddressSpaceMap(Z_INIT_VMAS_SELF, 0, gBootDenaliVmmoCap, &vaddr)); Channel local; check(SpawnProcessFromElfRegion(vaddr, local)); @@ -35,7 +27,7 @@ uint64_t main(uint64_t port_cap) { reinterpret_cast(&read), 0, nullptr)); DenaliReadResponse resp; - uint64_t mem_cap; + uint64_t mem_cap, type, bytes, caps; check(ZChannelRecv(local.cap(), sizeof(resp), reinterpret_cast(&resp), 1, &mem_cap, &type, diff --git a/zion/include/zcall.h b/zion/include/zcall.h index a9b4f9c..562fc8d 100644 --- a/zion/include/zcall.h +++ b/zion/include/zcall.h @@ -17,8 +17,6 @@ #define ZC_PROC_SPAWN_PROC 0x100 #define ZC_PROC_SPAWN_THREAD 0x101 -#define Z_INIT_PROC_SELF 0x1 - // Thread Calls. #define Z_THREAD_CREATE 0x10 #define Z_THREAD_START 0x11 @@ -28,15 +26,11 @@ #define Z_ADDRESS_SPACE_MAP 0x21 #define Z_ADDRESS_SPACE_UNMAP 0x22 -#define Z_INIT_VMAS_SELF 0x20 - #define Z_MEMORY_OBJECT_CREATE 0x30 #define Z_MEMORY_OBJECT_CREATE_PHYSICAL 0x31 #define Z_TEMP_PCIE_CONFIG_OBJECT_CREATE 0x3F -#define Z_INIT_BOOT_VMMO 0x31 - // IPC Calls #define Z_CHANNEL_CREATE 0x40 #define Z_CHANNEL_SEND 0x41 diff --git a/zion/include/zinit.h b/zion/include/zinit.h new file mode 100644 index 0000000..f948117 --- /dev/null +++ b/zion/include/zinit.h @@ -0,0 +1,6 @@ +#pragma once + +#define Z_INIT_PROC_SELF 0x00 +#define Z_INIT_VMAS_SELF 0x01 + +#define Z_BOOT_DENALI_VMMO 0x1000 diff --git a/zion/loader/init_loader.cpp b/zion/loader/init_loader.cpp index 4d1d550..1e3dcc8 100644 --- a/zion/loader/init_loader.cpp +++ b/zion/loader/init_loader.cpp @@ -3,6 +3,7 @@ #include "boot/boot_info.h" #include "debug/debug.h" #include "include/zcall.h" +#include "include/zinit.h" #include "lib/ref_ptr.h" #include "memory/paging_util.h" #include "object/process.h" @@ -71,7 +72,7 @@ uint64_t LoadElfProgram(Process& dest_proc, uint64_t base, uint64_t offset) { program.type, program.flags, program.offset, program.vaddr, program.paddr, program.filesz, program.memsz, program.align); #endif - auto mem_obj = MakeRefCounted(program.filesz); + auto mem_obj = MakeRefCounted(program.memsz); mem_obj->CopyBytesToObject(base + program.offset, program.filesz); dest_proc.vmas()->MapInMemoryObject(program.vaddr, mem_obj); } @@ -137,7 +138,7 @@ void LoadInitProgram() { auto port = MakeRefCounted(); uint64_t port_cap = proc->AddNewCapability(port, ZC_READ | ZC_WRITE); - uint64_t vmmo_id = Z_INIT_BOOT_VMMO; + uint64_t vmmo_id = Z_BOOT_DENALI_VMMO; ZMessage vmmo_msg{ .type = 0, .num_bytes = 8, diff --git a/zion/object/process.cpp b/zion/object/process.cpp index b32729c..dc8bdaf 100644 --- a/zion/object/process.cpp +++ b/zion/object/process.cpp @@ -2,6 +2,7 @@ #include "debug/debug.h" #include "include/zcall.h" +#include "include/zinit.h" #include "memory/paging_util.h" #include "memory/physical_memory.h" #include "object/thread.h"