From 830e41459cbeb60bcb887b01678dfae5719f00bd Mon Sep 17 00:00:00 2001 From: Stefanos Kornilios Mitsis Poiitidis Date: Thu, 15 Apr 2021 11:05:07 +0300 Subject: [PATCH] Fix build for test harness, irloader --- Source/Tests/HarnessHelpers.h | 10 +++++--- Source/Tests/IRLoader.cpp | 11 ++++++--- Source/Tests/TestHarnessRunner.cpp | 38 ++++++++++++++++++++++++------ 3 files changed, 46 insertions(+), 13 deletions(-) diff --git a/Source/Tests/HarnessHelpers.h b/Source/Tests/HarnessHelpers.h index 4ec7d4c0a..bce0ab765 100644 --- a/Source/Tests/HarnessHelpers.h +++ b/Source/Tests/HarnessHelpers.h @@ -349,7 +349,7 @@ namespace FEX::HarnessHelper { return STACK_SIZE; } - uint64_t SetupStack() override { + uint64_t GetStackPointer() override { if (Config.Is64BitMode()) { return reinterpret_cast(mmap(nullptr, STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)) + STACK_SIZE; } @@ -364,7 +364,7 @@ namespace FEX::HarnessHelper { return RIP; } - void MapMemoryRegion(std::function Mapper, std::function Unmapper) override { + bool MapMemory(std::function Mapper, std::function Unmapper) override { bool LimitedSize = true; auto DoMMap = [](uint64_t Address, size_t Size) -> void* { void *Result = mmap(reinterpret_cast(Address), Size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); @@ -410,9 +410,13 @@ namespace FEX::HarnessHelper { for (auto& [region, size] : Config.GetMemoryRegions()) { DoMMap(region, size); } + + LoadMemory(); + + return true; } - void LoadMemory() override { + void LoadMemory() { // Memory base here starts at the start location we passed back with GetLayout() // This will write at [CODE_START_RANGE + 0, RawFile.size() ) memcpy(reinterpret_cast(RIP), &RawFile.at(0), RawFile.size()); diff --git a/Source/Tests/IRLoader.cpp b/Source/Tests/IRLoader.cpp index 2c1ae08b9..3b71657cc 100644 --- a/Source/Tests/IRLoader.cpp +++ b/Source/Tests/IRLoader.cpp @@ -73,7 +73,7 @@ public: return STACK_SIZE; } - uint64_t SetupStack() override + uint64_t GetStackPointer() override { return reinterpret_cast(mmap(nullptr, STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); } @@ -83,13 +83,17 @@ public: return IR->GetEntryRIP(); } - void MapMemoryRegion(std::function Mapper, std::function Unmapper) override + bool MapMemory(std::function Mapper, std::function Unmapper) override { // Map the memory regions the test file asks for IR->MapRegions(); + + LoadMemory(); + + return true; } - void LoadMemory() override + void LoadMemory() { IR->LoadMemory(); } @@ -134,6 +138,7 @@ int main(int argc, char **argv, char **const envp) if (Loader.IsValid()) { IRCodeLoader CodeLoader{&Loader}; + CodeLoader.MapMemory(nullptr, nullptr); FEXCore::Context::InitCore(CTX, &CodeLoader); FEXCore::Context::ExitReason ShutdownReason = FEXCore::Context::ExitReason::EXIT_SHUTDOWN; diff --git a/Source/Tests/TestHarnessRunner.cpp b/Source/Tests/TestHarnessRunner.cpp index a3187555c..07913d1ff 100644 --- a/Source/Tests/TestHarnessRunner.cpp +++ b/Source/Tests/TestHarnessRunner.cpp @@ -9,7 +9,8 @@ $end_info$ #include "Common/EnvironmentLoader.h" #include "CommonCore/HostFactory.h" #include "HarnessHelpers.h" -#include "Tests/LinuxSyscalls/Syscalls.h" +#include "Tests/LinuxSyscalls/x32/Syscalls.h" +#include "Tests/LinuxSyscalls/x64/Syscalls.h" #include "Tests/LinuxSyscalls/SignalDelegator.h" #include @@ -79,13 +80,36 @@ int main(int argc, char **argv, char **const envp) { FEXCore::Context::InitializeContext(CTX); + + FEX::HLE::x32::MemAllocator *Allocator = nullptr; + + if (Loader.Is64BitMode()) { + if (!Loader.MapMemory([](void *addr, size_t length, int prot, int flags, int fd, off_t offset) { + return mmap(addr, length, prot, flags, fd, offset); + }, [](void *addr, size_t length) { + return munmap(addr, length); + })) { + // failed to map + return -ENOEXEC; + } + } else { + Allocator = new FEX::HLE::x32::MemAllocator(); + if (!Loader.MapMemory([Allocator](void *addr, size_t length, int prot, int flags, int fd, off_t offset) { + return Allocator->mmap(addr, length, prot, flags, fd, offset); + }, [Allocator](void *addr, size_t length) { + return Allocator->munmap(addr, length); + })) { + // failed to map + return -ENOEXEC; + } + } + std::unique_ptr SignalDelegation = std::make_unique(); - std::unique_ptr SyscallHandler{ - FEX::HLE::CreateHandler( - Loader.Is64BitMode() ? FEXCore::Context::OperatingMode::MODE_64BIT : FEXCore::Context::OperatingMode::MODE_32BIT, - CTX, - SignalDelegation.get(), - &Loader)}; + std::unique_ptr SyscallHandler{ + Loader.Is64BitMode() ? + FEX::HLE::x64::CreateHandler(CTX, SignalDelegation.get()) : + FEX::HLE::x32::CreateHandler(CTX, SignalDelegation.get(), Allocator) + }; bool DidFault = false; SignalDelegation->RegisterFrontendHostSignalHandler(SIGSEGV, [&DidFault](FEXCore::Core::InternalThreadState *Thread, int Signal, void *info, void *ucontext) {