diff --git a/External/FEXCore/Source/Interface/Context/Context.h b/External/FEXCore/Source/Interface/Context/Context.h index 5e7188219..03eaf5f0a 100644 --- a/External/FEXCore/Source/Interface/Context/Context.h +++ b/External/FEXCore/Source/Interface/Context/Context.h @@ -111,6 +111,9 @@ namespace FEXCore::Context { uintptr_t CompileBlock(FEXCore::Core::InternalThreadState *Thread, uint64_t GuestRIP); uintptr_t CompileFallbackBlock(FEXCore::Core::InternalThreadState *Thread, uint64_t GuestRIP); + + FEXCore::CodeLoader *GetCodeLoader() const { return LocalLoader; } + protected: IR::RegisterAllocationPass *GetRegisterAllocatorPass(); diff --git a/External/FEXCore/include/FEXCore/Core/CodeLoader.h b/External/FEXCore/include/FEXCore/Core/CodeLoader.h index 5d67deab8..172a0d694 100644 --- a/External/FEXCore/include/FEXCore/Core/CodeLoader.h +++ b/External/FEXCore/include/FEXCore/Core/CodeLoader.h @@ -81,7 +81,7 @@ public: virtual uint64_t GetFinalRIP() { return ~0ULL; } virtual char const *FindSymbolNameInRange(uint64_t Address) { return nullptr; } - + virtual void GetExecveArguments(std::vector *Args) {} }; diff --git a/External/cpp-optparse b/External/cpp-optparse index 5d46ee5bb..b8c75f118 160000 --- a/External/cpp-optparse +++ b/External/cpp-optparse @@ -1 +1 @@ -Subproject commit 5d46ee5bb5c7b5e8988c719aa2b45119df6c5092 +Subproject commit b8c75f118e5aff1a72ff3a5ce72177ab7bd2faad diff --git a/Source/Common/ArgumentLoader.cpp b/Source/Common/ArgumentLoader.cpp index f8f5a5214..d8a21890c 100644 --- a/Source/Common/ArgumentLoader.cpp +++ b/Source/Common/ArgumentLoader.cpp @@ -4,6 +4,7 @@ namespace FEX::ArgLoader { std::vector RemainingArgs; + std::vector ProgramArguments; void Load(int argc, char **argv) { @@ -190,12 +191,16 @@ namespace FEX::ArgLoader { const char* Value = Options.get("IPCID"); Config::Add("IPCID", Value); } - } RemainingArgs = Parser.args(); + ProgramArguments = Parser.parsed_args(); } std::vector Get() { return RemainingArgs; } + std::vector GetParsedArgs() { + return ProgramArguments; + } + } diff --git a/Source/Common/ArgumentLoader.h b/Source/Common/ArgumentLoader.h index 81651343b..2d51ed15a 100644 --- a/Source/Common/ArgumentLoader.h +++ b/Source/Common/ArgumentLoader.h @@ -7,4 +7,6 @@ namespace FEX::ArgLoader { void Load(int argc, char **argv); std::vector Get(); + std::vector GetParsedArgs(); + } diff --git a/Source/Tests/ELFLoader.cpp b/Source/Tests/ELFLoader.cpp index 47e18c1de..c582e3e9d 100644 --- a/Source/Tests/ELFLoader.cpp +++ b/Source/Tests/ELFLoader.cpp @@ -70,10 +70,11 @@ int main(int argc, char **argv, char **const envp) { FEX::Config::Value LDPath{"RootFS", ""}; auto Args = FEX::ArgLoader::Get(); + auto ParsedArgs = FEX::ArgLoader::GetParsedArgs(); LogMan::Throw::A(!Args.empty(), "Not enough arguments"); - FEX::HarnessHelper::ELFCodeLoader Loader{Args[0], Args, envp}; + FEX::HarnessHelper::ELFCodeLoader Loader{Args[0], Args, ParsedArgs, envp}; FEXCore::Context::InitializeStaticTables(); auto SHM = FEXCore::SHM::AllocateSHMRegion(1ULL << 32); @@ -81,7 +82,6 @@ int main(int argc, char **argv, char **const envp) { FEXCore::Context::InitializeContext(CTX); FEXCore::Context::SetApplicationFile(CTX, std::filesystem::canonical(Args[0])); - FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_DEFAULTCORE, CoreConfig() > 3 ? FEXCore::Config::CONFIG_CUSTOM : CoreConfig()); FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_MULTIBLOCK, MultiblockConfig()); FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_ACCURATESTDOUT, AccurateSTDConfig()); diff --git a/Source/Tests/HarnessHelpers.h b/Source/Tests/HarnessHelpers.h index 55b8efffd..7cb120d3d 100644 --- a/Source/Tests/HarnessHelpers.h +++ b/Source/Tests/HarnessHelpers.h @@ -381,7 +381,7 @@ namespace FEX::HarnessHelper { class ELFCodeLoader final : public FEXCore::CodeLoader { public: - ELFCodeLoader(std::string const &Filename, [[maybe_unused]] std::vector const &args, char **const envp = nullptr) + ELFCodeLoader(std::string const &Filename, [[maybe_unused]] std::vector const &args, std::vector const &ParsedArgs, char **const envp = nullptr) : File {Filename, false} , DB {&File} , Args {args} { @@ -427,6 +427,10 @@ public: //AuxVariables.emplace_back(auxv_t{26, 0}); // AT_HWCAP2 AuxVariables.emplace_back(auxv_t{32, 0ULL}); // sysinfo (vDSO) AuxVariables.emplace_back(auxv_t{33, 0ULL}); // sysinfo (vDSO) + + for (auto &Arg : ParsedArgs) { + LoaderArgs.emplace_back(Arg.c_str()); + } } uint64_t StackSize() const override { @@ -591,11 +595,14 @@ public: return DB.InitializeThreadSlot(Writer); }; + void GetExecveArguments(std::vector *Args) override { *Args = LoaderArgs; } + private: ::ELFLoader::ELFContainer File; ::ELFLoader::ELFSymbolDatabase DB; std::vector Args; std::vector EnvironmentVariables; + std::vector LoaderArgs; struct auxv_t { uint64_t key; uint64_t val; diff --git a/Source/Tests/LockstepRunner.cpp b/Source/Tests/LockstepRunner.cpp index 110152691..c1f397316 100644 --- a/Source/Tests/LockstepRunner.cpp +++ b/Source/Tests/LockstepRunner.cpp @@ -589,7 +589,7 @@ int main(int argc, char **argv) { FEXCore::Context::AddGuestMemoryRegion(CTX, SHM); if (ConfigELFType()) { - FEX::HarnessHelper::ELFCodeLoader Loader{File, {}}; + FEX::HarnessHelper::ELFCodeLoader Loader{File, {},{}}; bool Result = FEXCore::Context::InitCore(CTX, &Loader); printf("Did we Load? %s\n", Result ? "Yes" : "No"); } diff --git a/Source/Tools/Debugger/Main.cpp b/Source/Tools/Debugger/Main.cpp index 70dea768a..6578215af 100644 --- a/Source/Tools/Debugger/Main.cpp +++ b/Source/Tools/Debugger/Main.cpp @@ -54,7 +54,7 @@ void CreateCoreCallback(char const *Filename, bool ELF) { bool Result{}; if (ELF) { - FEX::HarnessHelper::ELFCodeLoader Loader{Filename, {}}; + FEX::HarnessHelper::ELFCodeLoader Loader{Filename, {}, {}}; Result = FEXCore::Context::InitCore(CTX, &Loader); } else {