diff --git a/CMakeLists.txt b/CMakeLists.txt index e62ea69..2c1bd27 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,7 @@ set(QEMU_CMD qemu-system-x86_64 -machine q35 -d guest_errors -m 1G -serial stdio add_custom_command( OUTPUT disk.img COMMAND sudo sh ../scripts/build_image.sh disk.img - DEPENDS zion yellowstone denali + DEPENDS zion yellowstone denali victoriafalls USES_TERMINAL ) diff --git a/lib/mammoth/src/init.cpp b/lib/mammoth/src/init.cpp index 7acfab8..c378cfe 100644 --- a/lib/mammoth/src/init.cpp +++ b/lib/mammoth/src/init.cpp @@ -12,6 +12,7 @@ uint64_t gSelfVmasCap = 0; uint64_t gInitEndpointCap = 0; uint64_t gBootDenaliVmmoCap = 0; +uint64_t gBootVictoriaFallsVmmoCap = 0; z_err_t ParseInitPort(uint64_t init_port_cap) { Port port(init_port_cap); @@ -35,6 +36,10 @@ z_err_t ParseInitPort(uint64_t init_port_cap) { dbgln("received denali"); gBootDenaliVmmoCap = init_cap; break; + case Z_BOOT_VICTORIA_FALLS_VMMO: + dbgln("received victoria falls"); + gBootVictoriaFallsVmmoCap = init_cap; + break; default: dbgln("Unexpected init type %x, continuing.", init_sig); } diff --git a/scripts/build_image.sh b/scripts/build_image.sh index 6b3a45c..6e2d07a 100644 --- a/scripts/build_image.sh +++ b/scripts/build_image.sh @@ -39,5 +39,6 @@ cp zion/zion efi/ mkdir -p efi/sys cp sys/yellowstone/yellowstone efi/sys/yellowstone cp sys/denali/denali efi/sys/denali +cp sys/victoriafalls/victoriafalls efi/sys/victoriafalls chown drew:drew $1 diff --git a/sys/CMakeLists.txt b/sys/CMakeLists.txt index b639c4b..095befe 100644 --- a/sys/CMakeLists.txt +++ b/sys/CMakeLists.txt @@ -1,5 +1,11 @@ set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "") -add_subdirectory(yellowstone) add_subdirectory(denali) +add_subdirectory(victoriafalls) +add_subdirectory(yellowstone) + +set(SYS_BUNDLE + denali + victoriafalls + yellowstone) diff --git a/sys/victoriafalls/CMakeLists.txt b/sys/victoriafalls/CMakeLists.txt new file mode 100644 index 0000000..5331f6d --- /dev/null +++ b/sys/victoriafalls/CMakeLists.txt @@ -0,0 +1,16 @@ +add_executable(victoriafalls + victoriafalls.cpp) + +target_include_directories(victoriafalls + PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} + "${CMAKE_CURRENT_SOURCE_DIR}/include") + +target_link_libraries(victoriafalls + glacier + mammoth_lib + ) + +set_target_properties(victoriafalls PROPERTIES + COMPILE_FLAGS "${CMAKE_CXX_FLAGS} ${BASE_COMPILE_FLAGS}" + LINK_FLAGS "${CMAKE_EXE_LINK_FLAGS} ${BASE_LINK_FLAGS}" + ) diff --git a/sys/victoriafalls/victoriafalls.cpp b/sys/victoriafalls/victoriafalls.cpp new file mode 100644 index 0000000..f368dcd --- /dev/null +++ b/sys/victoriafalls/victoriafalls.cpp @@ -0,0 +1,9 @@ +#include +#include + +uint64_t main(uint64_t init_cap) { + ParseInitPort(init_cap); + + dbgln("VFs Started"); + return 0; +} diff --git a/sys/yellowstone/yellowstone.cpp b/sys/yellowstone/yellowstone.cpp index 341567c..01a5c1d 100644 --- a/sys/yellowstone/yellowstone.cpp +++ b/sys/yellowstone/yellowstone.cpp @@ -28,6 +28,11 @@ uint64_t main(uint64_t port_cap) { check(reader.ParsePartitionTables()); + check(ZAddressSpaceMap(gSelfVmasCap, 0, gBootVictoriaFallsVmmoCap, &vaddr)); + auto error_or = SpawnProcessFromElfRegion(vaddr); + if (!error_or) { + check(error_or.error()); + } dbgln("Yellowstone Finished Successfully."); return 0; } diff --git a/zion/boot/limine.cfg b/zion/boot/limine.cfg index 64d2f51..0d3a965 100644 --- a/zion/boot/limine.cfg +++ b/zion/boot/limine.cfg @@ -8,3 +8,4 @@ TIMEOUT=0 KERNEL_PATH=boot:///zion MODULE_PATH=boot:///sys/yellowstone MODULE_PATH=boot:///sys/denali + MODULE_PATH=boot:///sys/victoriafalls diff --git a/zion/include/zglobal.h b/zion/include/zglobal.h index 5b0d9f7..477520e 100644 --- a/zion/include/zglobal.h +++ b/zion/include/zglobal.h @@ -8,3 +8,4 @@ extern uint64_t gSelfVmasCap; extern uint64_t gInitEndpointCap; extern uint64_t gBootDenaliVmmoCap; +extern uint64_t gBootVictoriaFallsVmmoCap; diff --git a/zion/include/zinit.h b/zion/include/zinit.h deleted file mode 100644 index 6f70f09..0000000 --- a/zion/include/zinit.h +++ /dev/null @@ -1 +0,0 @@ -#pragma once diff --git a/zion/include/ztypes.h b/zion/include/ztypes.h index 2a4e508..c0a7482 100644 --- a/zion/include/ztypes.h +++ b/zion/include/ztypes.h @@ -88,3 +88,4 @@ typedef uint64_t z_cap_t; #define Z_INIT_ENDPOINT 0x4100'0000 #define Z_BOOT_DENALI_VMMO 0x4200'0000 +#define Z_BOOT_VICTORIA_FALLS_VMMO 0x4200'0001 diff --git a/zion/loader/init_loader.cpp b/zion/loader/init_loader.cpp index 22d5766..87b5426 100644 --- a/zion/loader/init_loader.cpp +++ b/zion/loader/init_loader.cpp @@ -114,36 +114,42 @@ const limine_file& GetInitProgram(glcr::String path) { } } panic("Program not found: %s", path); + UNREACHABLE +} + +void WriteInitProgram(glcr::RefPtr port, glcr::String name, uint64_t id) { + const limine_file& prog = GetInitProgram(name); + glcr::RefPtr prog_vmmo = + glcr::MakeRefCounted(prog.size); + prog_vmmo->CopyBytesToObject(reinterpret_cast(prog.address), + prog.size); + port->WriteKernel(id, + MakeRefCounted(prog_vmmo, ZC_READ | ZC_WRITE)); } } // namespace void LoadInitProgram() { DumpModules(); - const limine_file& init_prog = GetInitProgram("/sys/yellowstone"); + // Create process. glcr::RefPtr proc = Process::Create(); gProcMan->InsertProcess(proc); - uint64_t entry = LoadElfProgram( - *proc, reinterpret_cast(init_prog.address), init_prog.size); - - const limine_file& prog2 = GetInitProgram("/sys/denali"); - glcr::RefPtr prog2_vmmo = - glcr::MakeRefCounted(prog2.size); - prog2_vmmo->CopyBytesToObject(reinterpret_cast(prog2.address), - prog2.size); - + // Write init data. auto port = glcr::MakeRefCounted(); uint64_t port_cap = proc->AddNewCapability(port, ZC_READ | ZC_WRITE); - port->WriteKernel(Z_INIT_SELF_PROC, MakeRefCounted( proc, ZC_PROC_SPAWN_PROC | ZC_PROC_SPAWN_THREAD)); port->WriteKernel(Z_INIT_SELF_VMAS, MakeRefCounted(proc->vmas(), ZC_WRITE)); - port->WriteKernel(Z_BOOT_DENALI_VMMO, - MakeRefCounted(prog2_vmmo, ZC_READ | ZC_WRITE)); + WriteInitProgram(port, "/sys/denali", Z_BOOT_DENALI_VMMO); + WriteInitProgram(port, "/sys/victoriafalls", Z_BOOT_VICTORIA_FALLS_VMMO); + // Start process. + const limine_file& init_prog = GetInitProgram("/sys/yellowstone"); + uint64_t entry = LoadElfProgram( + *proc, reinterpret_cast(init_prog.address), init_prog.size); proc->CreateThread()->Start(entry, port_cap, 0); }