From 3d9bdd3c8345e1146332e3b2a79f1e833b0e6efb Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Wed, 9 Dec 2020 23:27:56 -0800 Subject: [PATCH 1/7] Removes the broken TestSingleStepHardware runner --- Source/Tests/CMakeLists.txt | 8 -- Source/Tests/TestSingleStepHardware.cpp | 109 ------------------------ 2 files changed, 117 deletions(-) delete mode 100644 Source/Tests/TestSingleStepHardware.cpp diff --git a/Source/Tests/CMakeLists.txt b/Source/Tests/CMakeLists.txt index 94d06c9e7..5fa7895b6 100644 --- a/Source/Tests/CMakeLists.txt +++ b/Source/Tests/CMakeLists.txt @@ -87,14 +87,6 @@ target_include_directories(${NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Source/) target_link_libraries(${NAME} ${LIBS}) -set(NAME PTrace) -set(SRCS TestSingleStepHardware.cpp) - -add_executable(${NAME} ${SRCS}) -target_include_directories(${NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/Source/) - -target_link_libraries(${NAME} ${LIBS}) - set(NAME IRLoader) set(SRCS IRLoader.cpp diff --git a/Source/Tests/TestSingleStepHardware.cpp b/Source/Tests/TestSingleStepHardware.cpp deleted file mode 100644 index 46d9b4583..000000000 --- a/Source/Tests/TestSingleStepHardware.cpp +++ /dev/null @@ -1,109 +0,0 @@ -#include "Common/ArgumentLoader.h" -#include "Common/EnvironmentLoader.h" -#include "Common/Config.h" -#include "HarnessHelpers.h" - -#include -#include -#include -#include -#include -#include -#include - -namespace FEX { -uint8_t data[] = { - 0xb8, 0x00, 0x00, 0x80, 0x3f, // mov eax, 0x3f800000 - 0x0f, 0xc7, 0xf8, // rdseed eax - 0xba, 0x00, 0x00, 0x00, 0xe0, // mov edx, 0xe0000000 - 0x89, 0x02, // mov dword [edx], eax - 0xC3, // RET -}; - - class TestCodeLoader final : public FEXCore::CodeLoader { - static constexpr uint32_t PAGE_SIZE = 4096; - public: - - TestCodeLoader() = default; - - uint64_t StackSize() const override { - return STACK_SIZE; - } - - uint64_t SetupStack([[maybe_unused]] void *HostPtr, uint64_t GuestPtr) const override { - return GuestPtr + STACK_SIZE - 8; - } - - uint64_t DefaultRIP() const override { - return RIP; - } - - void MapMemoryRegion(std::function Mapper) override { - // XXX: Pull this from the config - Mapper(0xe000'0000, 0x1000'0000, true, true); - Mapper(0x2'0000'0000, 0x1'0000'1000, true, true); - } - - void LoadMemory(MemoryWriter Writer) override { - Writer(data, DefaultRIP(), sizeof(data)); - } - - private: - constexpr static uint64_t STACK_SIZE = PAGE_SIZE; - // Zero is special case to know when we are done - constexpr static uint64_t RIP = 0x1; - }; -} - -void MsgHandler(LogMan::DebugLevels Level, char const *Message) { - const char *CharLevel{nullptr}; - - switch (Level) { - case LogMan::NONE: - CharLevel = "NONE"; - break; - case LogMan::ASSERT: - CharLevel = "ASSERT"; - break; - case LogMan::ERROR: - CharLevel = "ERROR"; - break; - case LogMan::DEBUG: - CharLevel = "DEBUG"; - break; - case LogMan::INFO: - CharLevel = "Info"; - break; - default: - CharLevel = "???"; - break; - } - printf("[%s] %s\n", CharLevel, Message); -} - -void AssertHandler(char const *Message) { - printf("[ASSERT] %s\n", Message); -} - -int main(int argc, char **argv, char **const envp) { - LogMan::Throw::InstallHandler(AssertHandler); - LogMan::Msg::InstallHandler(MsgHandler); - FEXCore::Config::Initialize(); - FEXCore::Config::AddLayer(std::make_unique()); - FEXCore::Config::AddLayer(std::make_unique(argc, argv)); - FEXCore::Config::AddLayer(std::make_unique(envp)); - FEXCore::Config::Load(); - - FEXCore::Config::Value CoreConfig{FEXCore::Config::CONFIG_DEFAULTCORE, 0}; - auto Args = FEX::ArgLoader::Get(); - -// FEX::Core localCore {static_cast(CoreConfig())}; -// FEX::TestCodeLoader Loader{}; -// bool Result = localCore.Load(&Loader); -// -// auto Base = localCore.GetCPU()->MemoryMapper->GetPointer(0); -// localCore.RunLoop(true); -// printf("Managed to load? %s\n", Result ? "Yes" : "No"); - - return 0; -} From 8e3ac44e659a135f3d7d35d42f35f08ca0348e46 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Thu, 10 Dec 2020 01:46:27 -0800 Subject: [PATCH 2/7] Removes non-unified memory path from ARM64 --- .../Interface/Core/JIT/Arm64/AtomicOps.cpp | 67 ------------------- .../Interface/Core/JIT/Arm64/MemoryOps.cpp | 25 +------ 2 files changed, 1 insertion(+), 91 deletions(-) diff --git a/External/FEXCore/Source/Interface/Core/JIT/Arm64/AtomicOps.cpp b/External/FEXCore/Source/Interface/Core/JIT/Arm64/AtomicOps.cpp index be69b401b..83b499bd7 100644 --- a/External/FEXCore/Source/Interface/Core/JIT/Arm64/AtomicOps.cpp +++ b/External/FEXCore/Source/Interface/Core/JIT/Arm64/AtomicOps.cpp @@ -13,12 +13,6 @@ DEF_OP(CASPair) { auto Desired = GetSrcPair(Op->Header.Args[1].ID()); auto MemSrc = GetReg(Op->Header.Args[2].ID()); - if (!CTX->Config.UnifiedMemory) { - LoadConstant(TMP1, (uint64_t)CTX->MemoryMapper.GetMemoryBase()); - add(TMP1, TMP1, MemSrc); - MemSrc = TMP1; - } - if (SupportsAtomics) { mov(TMP3, Expected.first); mov(TMP4, Expected.second); @@ -108,12 +102,6 @@ DEF_OP(CAS) { auto Desired = GetReg(Op->Header.Args[1].ID()); auto MemSrc = GetReg(Op->Header.Args[2].ID()); - if (!CTX->Config.UnifiedMemory) { - LoadConstant(TMP1, (uint64_t)CTX->MemoryMapper.GetMemoryBase()); - add(TMP1, TMP1, MemSrc); - MemSrc = TMP1; - } - if (SupportsAtomics) { mov(TMP2, Expected); switch (OpSize) { @@ -221,11 +209,6 @@ DEF_OP(AtomicAdd) { auto Op = IROp->C(); auto MemSrc = GetReg(Op->Header.Args[0].ID()); - if (!CTX->Config.UnifiedMemory) { - LoadConstant(TMP1, (uint64_t)CTX->MemoryMapper.GetMemoryBase()); - add(TMP1, TMP1, MemSrc); - MemSrc = TMP1; - } if (SupportsAtomics) { switch (Op->Size) { @@ -284,11 +267,6 @@ DEF_OP(AtomicSub) { auto Op = IROp->C(); auto MemSrc = GetReg(Op->Header.Args[0].ID()); - if (!CTX->Config.UnifiedMemory) { - LoadConstant(TMP1, (uint64_t)CTX->MemoryMapper.GetMemoryBase()); - add(TMP1, TMP1, MemSrc); - MemSrc = TMP1; - } if (SupportsAtomics) { neg(TMP2, GetReg(Op->Header.Args[1].ID())); @@ -348,11 +326,6 @@ DEF_OP(AtomicAnd) { auto Op = IROp->C(); auto MemSrc = GetReg(Op->Header.Args[0].ID()); - if (!CTX->Config.UnifiedMemory) { - LoadConstant(TMP1, (uint64_t)CTX->MemoryMapper.GetMemoryBase()); - add(TMP1, TMP1, MemSrc); - MemSrc = TMP1; - } if (SupportsAtomics) { mvn(TMP2, GetReg(Op->Header.Args[1].ID())); @@ -412,11 +385,6 @@ DEF_OP(AtomicOr) { auto Op = IROp->C(); auto MemSrc = GetReg(Op->Header.Args[0].ID()); - if (!CTX->Config.UnifiedMemory) { - LoadConstant(TMP1, (uint64_t)CTX->MemoryMapper.GetMemoryBase()); - add(TMP1, TMP1, MemSrc); - MemSrc = TMP1; - } if (SupportsAtomics) { switch (Op->Size) { @@ -475,11 +443,6 @@ DEF_OP(AtomicXor) { auto Op = IROp->C(); auto MemSrc = GetReg(Op->Header.Args[0].ID()); - if (!CTX->Config.UnifiedMemory) { - LoadConstant(TMP1, (uint64_t)CTX->MemoryMapper.GetMemoryBase()); - add(TMP1, TMP1, MemSrc); - MemSrc = TMP1; - } if (SupportsAtomics) { switch (Op->Size) { @@ -538,11 +501,6 @@ DEF_OP(AtomicSwap) { auto Op = IROp->C(); auto MemSrc = GetReg(Op->Header.Args[0].ID()); - if (!CTX->Config.UnifiedMemory) { - LoadConstant(TMP1, (uint64_t)CTX->MemoryMapper.GetMemoryBase()); - add(TMP1, TMP1, MemSrc); - MemSrc = TMP1; - } if (SupportsAtomics) { mov(TMP2, GetReg(Op->Header.Args[1].ID())); @@ -602,11 +560,6 @@ DEF_OP(AtomicSwap) { DEF_OP(AtomicFetchAdd) { auto Op = IROp->C(); auto MemSrc = GetReg(Op->Header.Args[0].ID()); - if (!CTX->Config.UnifiedMemory) { - LoadConstant(TMP1, (uint64_t)CTX->MemoryMapper.GetMemoryBase()); - add(TMP1, TMP1, MemSrc); - MemSrc = TMP1; - } if (SupportsAtomics) { switch (Op->Size) { @@ -668,11 +621,6 @@ DEF_OP(AtomicFetchAdd) { DEF_OP(AtomicFetchSub) { auto Op = IROp->C(); auto MemSrc = GetReg(Op->Header.Args[0].ID()); - if (!CTX->Config.UnifiedMemory) { - LoadConstant(TMP1, (uint64_t)CTX->MemoryMapper.GetMemoryBase()); - add(TMP1, TMP1, MemSrc); - MemSrc = TMP1; - } if (SupportsAtomics) { neg(TMP2, GetReg(Op->Header.Args[1].ID())); @@ -735,11 +683,6 @@ DEF_OP(AtomicFetchSub) { DEF_OP(AtomicFetchAnd) { auto Op = IROp->C(); auto MemSrc = GetReg(Op->Header.Args[0].ID()); - if (!CTX->Config.UnifiedMemory) { - LoadConstant(TMP1, (uint64_t)CTX->MemoryMapper.GetMemoryBase()); - add(TMP1, TMP1, MemSrc); - MemSrc = TMP1; - } if (SupportsAtomics) { mvn(TMP2, GetReg(Op->Header.Args[1].ID())); @@ -802,11 +745,6 @@ DEF_OP(AtomicFetchAnd) { DEF_OP(AtomicFetchOr) { auto Op = IROp->C(); auto MemSrc = GetReg(Op->Header.Args[0].ID()); - if (!CTX->Config.UnifiedMemory) { - LoadConstant(TMP1, (uint64_t)CTX->MemoryMapper.GetMemoryBase()); - add(TMP1, TMP1, MemSrc); - MemSrc = TMP1; - } if (SupportsAtomics) { switch (Op->Size) { @@ -868,11 +806,6 @@ DEF_OP(AtomicFetchOr) { DEF_OP(AtomicFetchXor) { auto Op = IROp->C(); auto MemSrc = GetReg(Op->Header.Args[0].ID()); - if (!CTX->Config.UnifiedMemory) { - LoadConstant(TMP1, (uint64_t)CTX->MemoryMapper.GetMemoryBase()); - add(TMP1, TMP1, MemSrc); - MemSrc = TMP1; - } if (SupportsAtomics) { switch (Op->Size) { diff --git a/External/FEXCore/Source/Interface/Core/JIT/Arm64/MemoryOps.cpp b/External/FEXCore/Source/Interface/Core/JIT/Arm64/MemoryOps.cpp index 3b4c99842..1dc665f7e 100644 --- a/External/FEXCore/Source/Interface/Core/JIT/Arm64/MemoryOps.cpp +++ b/External/FEXCore/Source/Interface/Core/JIT/Arm64/MemoryOps.cpp @@ -426,13 +426,6 @@ DEF_OP(LoadMem) { auto Op = IROp->C(); auto MemReg = GetReg(Op->Header.Args[0].ID()); - - if (!CTX->Config.UnifiedMemory) { - MemReg = TMP1; - LoadConstant(MemReg, (uint64_t)CTX->MemoryMapper.GetMemoryBase()); - add(MemReg, MemReg, GetReg(Op->Header.Args[0].ID())); - } - auto MemSrc = GenerateMemOperand(Op->Size, MemReg, Op->Offset, Op->OffsetType, Op->OffsetScale); if (Op->Class == FEXCore::IR::GPRClass) { @@ -480,11 +473,6 @@ DEF_OP(LoadMemTSO) { auto Op = IROp->C(); auto MemSrc = MemOperand(GetReg(Op->Header.Args[0].ID())); - if (!CTX->Config.UnifiedMemory) { - LoadConstant(TMP1, (uint64_t)CTX->MemoryMapper.GetMemoryBase()); - add(TMP1, TMP1, GetReg(Op->Header.Args[0].ID())); - MemSrc = MemOperand(TMP1); - } if (!Op->Offset.IsInvalid()) { LogMan::Msg::A("LoadMemTSO: No offset allowed"); @@ -564,14 +552,8 @@ DEF_OP(LoadMemTSO) { DEF_OP(StoreMem) { auto Op = IROp->C(); - - auto MemReg = GetReg(Op->Header.Args[0].ID()); - if (!CTX->Config.UnifiedMemory) { - MemReg = TMP1; - LoadConstant(MemReg, (uint64_t)CTX->MemoryMapper.GetMemoryBase()); - add(MemReg, MemReg, GetReg(Op->Header.Args[0].ID())); - } + auto MemReg = GetReg(Op->Header.Args[0].ID()); auto MemSrc = GenerateMemOperand(Op->Size, MemReg, Op->Offset, Op->OffsetType, Op->OffsetScale); @@ -618,11 +600,6 @@ DEF_OP(StoreMem) { DEF_OP(StoreMemTSO) { auto Op = IROp->C(); auto MemSrc = MemOperand(GetReg(Op->Header.Args[0].ID())); - if (!CTX->Config.UnifiedMemory) { - LoadConstant(TMP1, (uint64_t)CTX->MemoryMapper.GetMemoryBase()); - add(TMP1, TMP1, GetReg(Op->Header.Args[0].ID())); - MemSrc = MemOperand(TMP1); - } if (!Op->Offset.IsInvalid()) { LogMan::Msg::A("StoreMemTSO: No offset allowed"); From dc8caeaf912c80cc5249a7e3bf40e8039549c1d5 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Thu, 10 Dec 2020 01:47:09 -0800 Subject: [PATCH 3/7] Removes non-unified memory path from x86_64 --- .../Interface/Core/JIT/x86_64/AtomicOps.cpp | 130 ++---------------- .../Interface/Core/JIT/x86_64/MemoryOps.cpp | 20 +-- 2 files changed, 16 insertions(+), 134 deletions(-) diff --git a/External/FEXCore/Source/Interface/Core/JIT/x86_64/AtomicOps.cpp b/External/FEXCore/Source/Interface/Core/JIT/x86_64/AtomicOps.cpp index aa573375d..157c4da1a 100644 --- a/External/FEXCore/Source/Interface/Core/JIT/x86_64/AtomicOps.cpp +++ b/External/FEXCore/Source/Interface/Core/JIT/x86_64/AtomicOps.cpp @@ -15,20 +15,12 @@ DEF_OP(CASPair) { // This will write to memory! Careful! // Third operand must be a calculated guest memory address //OrderedNode *CASResult = _CAS(Src3, Src2, Src1); - uint64_t Memory = CTX->MemoryMapper.GetBaseOffset(0); auto Dst = GetSrcPair(Node); auto Expected = GetSrcPair(Op->Header.Args[0].ID()); auto Desired = GetSrcPair(Op->Header.Args[1].ID()); auto MemSrc = GetSrc(Op->Header.Args[2].ID()); - Xbyak::Reg MemReg = rdi; - if (CTX->Config.UnifiedMemory) { - MemReg = MemSrc; - } - else { - mov(MemReg, Memory); - add(MemReg, MemSrc); - } + Xbyak::Reg MemReg = MemSrc; mov(rax, Expected.first); mov(rdx, Expected.second); @@ -73,16 +65,8 @@ DEF_OP(CAS) { // This will write to memory! Careful! // Third operand must be a calculated guest memory address //OrderedNode *CASResult = _CAS(Src3, Src2, Src1); - uint64_t Memory = CTX->MemoryMapper.GetBaseOffset(0); - Xbyak::Reg MemReg = rcx; - if (CTX->Config.UnifiedMemory) { - MemReg = GetSrc(Op->Header.Args[2].ID()); - } - else { - mov(MemReg, Memory); - add(MemReg, GetSrc(Op->Header.Args[2].ID())); - } + Xbyak::Reg MemReg = GetSrc(Op->Header.Args[2].ID()); mov(rdx, GetSrc(Op->Header.Args[1].ID())); mov(rax, GetSrc(Op->Header.Args[0].ID())); @@ -121,16 +105,8 @@ DEF_OP(CAS) { DEF_OP(AtomicAdd) { auto Op = IROp->C(); - uint64_t Memory = CTX->MemoryMapper.GetBaseOffset(0); - Xbyak::Reg MemReg = rax; - if (CTX->Config.UnifiedMemory) { - MemReg = GetSrc(Op->Header.Args[0].ID()); - } - else { - mov(MemReg, Memory); - add(MemReg, GetSrc(Op->Header.Args[0].ID())); - } + Xbyak::Reg MemReg = GetSrc(Op->Header.Args[0].ID()); lock(); switch (Op->Size) { @@ -152,16 +128,8 @@ DEF_OP(AtomicAdd) { DEF_OP(AtomicSub) { auto Op = IROp->C(); - uint64_t Memory = CTX->MemoryMapper.GetBaseOffset(0); - Xbyak::Reg MemReg = rax; - if (CTX->Config.UnifiedMemory) { - MemReg = GetSrc(Op->Header.Args[0].ID()); - } - else { - mov(MemReg, Memory); - add(MemReg, GetSrc(Op->Header.Args[0].ID())); - } + Xbyak::Reg MemReg = GetSrc(Op->Header.Args[0].ID()); lock(); switch (Op->Size) { case 1: @@ -182,16 +150,8 @@ DEF_OP(AtomicSub) { DEF_OP(AtomicAnd) { auto Op = IROp->C(); - uint64_t Memory = CTX->MemoryMapper.GetBaseOffset(0); - Xbyak::Reg MemReg = rax; - if (CTX->Config.UnifiedMemory) { - MemReg = GetSrc(Op->Header.Args[0].ID()); - } - else { - mov(MemReg, Memory); - add(MemReg, GetSrc(Op->Header.Args[0].ID())); - } + Xbyak::Reg MemReg = GetSrc(Op->Header.Args[0].ID()); lock(); switch (Op->Size) { case 1: @@ -212,16 +172,8 @@ DEF_OP(AtomicAnd) { DEF_OP(AtomicOr) { auto Op = IROp->C(); - uint64_t Memory = CTX->MemoryMapper.GetBaseOffset(0); - Xbyak::Reg MemReg = rax; - if (CTX->Config.UnifiedMemory) { - MemReg = GetSrc(Op->Header.Args[0].ID()); - } - else { - mov(MemReg, Memory); - add(MemReg, GetSrc(Op->Header.Args[0].ID())); - } + Xbyak::Reg MemReg = GetSrc(Op->Header.Args[0].ID()); lock(); switch (Op->Size) { case 1: @@ -242,16 +194,8 @@ DEF_OP(AtomicOr) { DEF_OP(AtomicXor) { auto Op = IROp->C(); - uint64_t Memory = CTX->MemoryMapper.GetBaseOffset(0); - Xbyak::Reg MemReg = rax; - if (CTX->Config.UnifiedMemory) { - MemReg = GetSrc(Op->Header.Args[0].ID()); - } - else { - mov(MemReg, Memory); - add(MemReg, GetSrc(Op->Header.Args[0].ID())); - } + Xbyak::Reg MemReg = GetSrc(Op->Header.Args[0].ID()); lock(); switch (Op->Size) { case 1: @@ -272,16 +216,10 @@ DEF_OP(AtomicXor) { DEF_OP(AtomicSwap) { auto Op = IROp->C(); - uint64_t Memory = CTX->MemoryMapper.GetBaseOffset(0); Xbyak::Reg MemReg = rax; - if (CTX->Config.UnifiedMemory) { - mov(MemReg, GetSrc(Op->Header.Args[0].ID())); - } - else { - mov(MemReg, Memory); - add(MemReg, GetSrc(Op->Header.Args[0].ID())); - } + mov(MemReg, GetSrc(Op->Header.Args[0].ID())); + switch (Op->Size) { case 1: mov(GetDst(Node), GetSrc(Op->Header.Args[1].ID())); @@ -309,16 +247,8 @@ DEF_OP(AtomicSwap) { DEF_OP(AtomicFetchAdd) { auto Op = IROp->C(); - uint64_t Memory = CTX->MemoryMapper.GetBaseOffset(0); - Xbyak::Reg MemReg = rax; - if (CTX->Config.UnifiedMemory) { - MemReg = GetSrc(Op->Header.Args[0].ID()); - } - else { - mov(MemReg, Memory); - add(MemReg, GetSrc(Op->Header.Args[0].ID())); - } + Xbyak::Reg MemReg = GetSrc(Op->Header.Args[0].ID()); switch (Op->Size) { case 1: mov(cl, GetSrc(Op->Header.Args[1].ID())); @@ -350,16 +280,8 @@ DEF_OP(AtomicFetchAdd) { DEF_OP(AtomicFetchSub) { auto Op = IROp->C(); - uint64_t Memory = CTX->MemoryMapper.GetBaseOffset(0); - Xbyak::Reg MemReg = rax; - if (CTX->Config.UnifiedMemory) { - MemReg = GetSrc(Op->Header.Args[0].ID()); - } - else { - mov(MemReg, Memory); - add(MemReg, GetSrc(Op->Header.Args[0].ID())); - } + Xbyak::Reg MemReg = GetSrc(Op->Header.Args[0].ID()); switch (Op->Size) { case 1: mov(cl, GetSrc(Op->Header.Args[1].ID())); @@ -395,17 +317,9 @@ DEF_OP(AtomicFetchSub) { DEF_OP(AtomicFetchAnd) { auto Op = IROp->C(); - uint64_t Memory = CTX->MemoryMapper.GetBaseOffset(0); // TMP1 = rax - Xbyak::Reg MemReg = TMP4; - if (CTX->Config.UnifiedMemory) { - MemReg = GetSrc(Op->Header.Args[0].ID()); - } - else { - mov(MemReg, Memory); - add(MemReg, GetSrc(Op->Header.Args[0].ID())); - } + Xbyak::Reg MemReg = GetSrc(Op->Header.Args[0].ID()); switch (Op->Size) { case 1: { @@ -481,17 +395,9 @@ DEF_OP(AtomicFetchAnd) { DEF_OP(AtomicFetchOr) { auto Op = IROp->C(); - uint64_t Memory = CTX->MemoryMapper.GetBaseOffset(0); // TMP1 = rax - Xbyak::Reg MemReg = TMP4; - if (CTX->Config.UnifiedMemory) { - MemReg = GetSrc(Op->Header.Args[0].ID()); - } - else { - mov(MemReg, Memory); - add(MemReg, GetSrc(Op->Header.Args[0].ID())); - } + Xbyak::Reg MemReg = GetSrc(Op->Header.Args[0].ID()); switch (Op->Size) { case 1: { mov(TMP1.cvt8(), byte [MemReg]); @@ -566,17 +472,9 @@ DEF_OP(AtomicFetchOr) { DEF_OP(AtomicFetchXor) { auto Op = IROp->C(); - uint64_t Memory = CTX->MemoryMapper.GetBaseOffset(0); // TMP1 = rax - Xbyak::Reg MemReg = TMP4; - if (CTX->Config.UnifiedMemory) { - MemReg = GetSrc(Op->Header.Args[0].ID()); - } - else { - mov(MemReg, Memory); - add(MemReg, GetSrc(Op->Header.Args[0].ID())); - } + Xbyak::Reg MemReg = GetSrc(Op->Header.Args[0].ID()); switch (Op->Size) { case 1: { mov(TMP1.cvt8(), byte [MemReg]); diff --git a/External/FEXCore/Source/Interface/Core/JIT/x86_64/MemoryOps.cpp b/External/FEXCore/Source/Interface/Core/JIT/x86_64/MemoryOps.cpp index d8155d8e8..c13c0cdf1 100644 --- a/External/FEXCore/Source/Interface/Core/JIT/x86_64/MemoryOps.cpp +++ b/External/FEXCore/Source/Interface/Core/JIT/x86_64/MemoryOps.cpp @@ -480,16 +480,8 @@ Xbyak::RegExp JITCore::GenerateModRM(Xbyak::Reg Base, IR::OrderedNodeWrapper Off DEF_OP(LoadMem) { auto Op = IROp->C(); - uint64_t Memory = CTX->MemoryMapper.GetBaseOffset(0); - Xbyak::Reg MemReg = rax; - if (CTX->Config.UnifiedMemory) { - MemReg = GetSrc(Op->Addr.ID()); - } - else { - mov(MemReg, Memory); - add(MemReg, GetSrc(Op->Addr.ID())); - } + Xbyak::Reg MemReg = GetSrc(Op->Addr.ID()); auto MemPtr = GenerateModRM(MemReg, Op->Offset, Op->OffsetType, Op->OffsetScale); @@ -556,16 +548,8 @@ DEF_OP(LoadMem) { DEF_OP(StoreMem) { auto Op = IROp->C(); - uint64_t Memory = CTX->MemoryMapper.GetBaseOffset(0); - Xbyak::Reg MemReg = rax; - if (CTX->Config.UnifiedMemory) { - MemReg = GetSrc(Op->Addr.ID()); - } - else { - mov(MemReg, Memory); - add(MemReg, GetSrc(Op->Addr.ID())); - } + Xbyak::Reg MemReg = GetSrc(Op->Addr.ID()); auto MemPtr = GenerateModRM(MemReg, Op->Offset, Op->OffsetType, Op->OffsetScale); From 899e24abd003fe91201869b23e1510c897f94be2 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Thu, 10 Dec 2020 01:47:32 -0800 Subject: [PATCH 4/7] Removes non-unified memory path from Interpreter --- .../Core/Interpreter/InterpreterCore.cpp | 502 ++---------------- 1 file changed, 55 insertions(+), 447 deletions(-) diff --git a/External/FEXCore/Source/Interface/Core/Interpreter/InterpreterCore.cpp b/External/FEXCore/Source/Interface/Core/Interpreter/InterpreterCore.cpp index 058198fa6..0f2091484 100644 --- a/External/FEXCore/Source/Interface/Core/Interpreter/InterpreterCore.cpp +++ b/External/FEXCore/Source/Interface/Core/Interpreter/InterpreterCore.cpp @@ -841,14 +841,7 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { // Size is the size of each pair element switch (Size) { case 4: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[2]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[2])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[2])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[2]); uint64_t Src1 = *GetSrc(SSAData, Op->Header.Args[0]); uint64_t Src2 = *GetSrc(SSAData, Op->Header.Args[1]); @@ -859,14 +852,7 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { break; } case 8: { - std::atomic<__uint128_t> *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[2]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[2])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[2])); - } + std::atomic<__uint128_t> *Data = *GetSrc **>(SSAData, Op->Header.Args[2]); __uint128_t Src1 = *GetSrc<__uint128_t*>(SSAData, Op->Header.Args[0]); __uint128_t Src2 = *GetSrc<__uint128_t*>(SSAData, Op->Header.Args[1]); @@ -920,14 +906,7 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { case IR::OP_LOADMEM: case IR::OP_LOADMEMTSO: { auto Op = IROp->C(); - uint8_t const *Data{}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc(SSAData, Op->Addr); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer(*GetSrc(SSAData, Op->Addr)); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Addr)); - } + uint8_t const *Data = *GetSrc(SSAData, Op->Addr); if (!Op->Offset.IsInvalid()) { auto Offset = *GetSrc(SSAData, Op->Offset) * Op->OffsetScale; @@ -938,20 +917,12 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { case MEM_OFFSET_SXTW.Val: Data += (int32_t)Offset; break; } } - memcpy(GDP, Data, OpSize); break; } case IR::OP_VLOADMEMELEMENT: { auto Op = IROp->C(); - void const *Data{}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + void const *Data = *GetSrc(SSAData, Op->Header.Args[0]); memcpy(GDP, GetSrc(SSAData, Op->Header.Args[1]), 16); memcpy(reinterpret_cast(reinterpret_cast(GDP) + (Op->Header.ElementSize * Op->Index)), @@ -962,14 +933,7 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { case IR::OP_STOREMEMTSO: { #define STORE_DATA(x, y) \ case x: { \ - uint8_t *Data{}; \ - if (Thread->CTX->Config.UnifiedMemory) { \ - Data = *GetSrc(SSAData, Op->Addr); \ - } \ - else { \ - Data = Thread->CTX->MemoryMapper.GetPointer(*GetSrc(SSAData, Op->Addr)); \ - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Addr)); \ - } \ + uint8_t *Data = *GetSrc(SSAData, Op->Addr); \ if (!Op->Offset.IsInvalid()) {\ auto Offset = *GetSrc(SSAData, Op->Offset) * Op->OffsetScale;\ \ @@ -991,14 +955,7 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { STORE_DATA(4, uint32_t) STORE_DATA(8, uint64_t) case 16: { - void *Data{}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + void *Data = *GetSrc(SSAData, Op->Header.Args[0]); void *Src = GetSrc(SSAData, Op->Header.Args[1]); memcpy(Data, Src, 16); @@ -1012,14 +969,7 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { case IR::OP_VSTOREMEMELEMENT: { #define STORE_DATA(x, y) \ case x: { \ - y *Data{}; \ - if (Thread->CTX->Config.UnifiedMemory) { \ - Data = *GetSrc(SSAData, Op->Header.Args[0]); \ - } \ - else { \ - Data = Thread->CTX->MemoryMapper.GetPointer(*GetSrc(SSAData, Op->Header.Args[0])); \ - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); \ - } \ + y *Data = *GetSrc(SSAData, Op->Header.Args[0]); \ memcpy(Data, &GetSrc(SSAData, Op->Header.Args[1])[Op->Index], sizeof(y)); \ break; \ } @@ -1606,14 +1556,7 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { auto Size = OpSize; switch (Size) { case 1: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[2]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[2])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[2])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[2]); uint8_t Src1 = *GetSrc(SSAData, Op->Header.Args[0]); uint8_t Src2 = *GetSrc(SSAData, Op->Header.Args[1]); @@ -1624,15 +1567,7 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { break; } case 2: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[2]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[2])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[2])); - } - + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[2]); uint16_t Src1 = *GetSrc(SSAData, Op->Header.Args[0]); uint16_t Src2 = *GetSrc(SSAData, Op->Header.Args[1]); @@ -1642,14 +1577,7 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { break; } case 4: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[2]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[2])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[2])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[2]); uint32_t Src1 = *GetSrc(SSAData, Op->Header.Args[0]); uint32_t Src2 = *GetSrc(SSAData, Op->Header.Args[1]); @@ -1660,14 +1588,7 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { break; } case 8: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[2]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[2])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[2])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[2]); uint64_t Src1 = *GetSrc(SSAData, Op->Header.Args[0]); uint64_t Src2 = *GetSrc(SSAData, Op->Header.Args[1]); @@ -1685,55 +1606,25 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { auto Op = IROp->C(); switch (Op->Size) { case 1: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } - + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint8_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data += Src; break; } case 2: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint16_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data += Src; break; } case 4: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint32_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data += Src; break; } case 8: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint64_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data += Src; break; @@ -1746,53 +1637,25 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { auto Op = IROp->C(); switch (Op->Size) { case 1: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint8_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data -= Src; break; } case 2: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint16_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data -= Src; break; } case 4: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint32_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data -= Src; break; } case 8: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint64_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data -= Src; break; @@ -1805,53 +1668,25 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { auto Op = IROp->C(); switch (Op->Size) { case 1: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint8_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data &= Src; break; } case 2: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint16_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data &= Src; break; } case 4: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint32_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data &= Src; break; } case 8: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint64_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data &= Src; break; @@ -1864,55 +1699,25 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { auto Op = IROp->C(); switch (Op->Size) { case 1: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint8_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data |= Src; break; } case 2: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint16_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data |= Src; break; } case 4: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint32_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data |= Src; break; } case 8: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint64_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data |= Src; break; @@ -1925,54 +1730,25 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { auto Op = IROp->C(); switch (Op->Size) { case 1: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint8_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data ^= Src; break; } case 2: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint16_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data ^= Src; break; } case 4: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint32_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data ^= Src; break; } case 8: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint64_t Src = *GetSrc(SSAData, Op->Header.Args[1]); *Data ^= Src; break; @@ -1985,56 +1761,28 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { auto Op = IROp->C(); switch (Op->Size) { case 1: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint8_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint8_t Previous = Data->exchange(Src); GD = Previous; break; } case 2: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint16_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint16_t Previous = Data->exchange(Src); GD = Previous; break; } case 4: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint32_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint32_t Previous = Data->exchange(Src); GD = Previous; break; } case 8: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint64_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint64_t Previous = Data->exchange(Src); GD = Previous; @@ -2048,56 +1796,28 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { auto Op = IROp->C(); switch (Op->Size) { case 1: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint8_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint8_t Previous = Data->fetch_add(Src); GD = Previous; break; } case 2: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint16_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint16_t Previous = Data->fetch_add(Src); GD = Previous; break; } case 4: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint32_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint32_t Previous = Data->fetch_add(Src); GD = Previous; break; } case 8: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint64_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint64_t Previous = Data->fetch_add(Src); GD = Previous; @@ -2111,56 +1831,28 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { auto Op = IROp->C(); switch (Op->Size) { case 1: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint8_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint8_t Previous = Data->fetch_sub(Src); GD = Previous; break; } case 2: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint16_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint16_t Previous = Data->fetch_sub(Src); GD = Previous; break; } case 4: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint32_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint32_t Previous = Data->fetch_sub(Src); GD = Previous; break; } case 8: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint64_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint64_t Previous = Data->fetch_sub(Src); GD = Previous; @@ -2174,56 +1866,28 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { auto Op = IROp->C(); switch (Op->Size) { case 1: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint8_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint8_t Previous = Data->fetch_and(Src); GD = Previous; break; } case 2: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint16_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint16_t Previous = Data->fetch_and(Src); GD = Previous; break; } case 4: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint32_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint32_t Previous = Data->fetch_and(Src); GD = Previous; break; } case 8: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint64_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint64_t Previous = Data->fetch_and(Src); GD = Previous; @@ -2237,56 +1901,28 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { auto Op = IROp->C(); switch (Op->Size) { case 1: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint8_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint8_t Previous = Data->fetch_or(Src); GD = Previous; break; } case 2: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint16_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint16_t Previous = Data->fetch_or(Src); GD = Previous; break; } case 4: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint32_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint32_t Previous = Data->fetch_or(Src); GD = Previous; break; } case 8: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint64_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint64_t Previous = Data->fetch_or(Src); GD = Previous; @@ -2300,56 +1936,28 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { auto Op = IROp->C(); switch (Op->Size) { case 1: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint8_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint8_t Previous = Data->fetch_xor(Src); GD = Previous; break; } case 2: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint16_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint16_t Previous = Data->fetch_xor(Src); GD = Previous; break; } case 4: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint32_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint32_t Previous = Data->fetch_xor(Src); GD = Previous; break; } case 8: { - std::atomic *Data = {}; - if (Thread->CTX->Config.UnifiedMemory) { - Data = *GetSrc **>(SSAData, Op->Header.Args[0]); - } - else { - Data = Thread->CTX->MemoryMapper.GetPointer *>(*GetSrc(SSAData, Op->Header.Args[0])); - LogMan::Throw::A(Data != nullptr, "Couldn't Map pointer to 0x%lx\n", *GetSrc(SSAData, Op->Header.Args[0])); - } + std::atomic *Data = *GetSrc **>(SSAData, Op->Header.Args[0]); uint64_t Src = *GetSrc(SSAData, Op->Header.Args[1]); uint64_t Previous = Data->fetch_xor(Src); GD = Previous; From 36b24ad141804378e38a57c6d5cff231aadb9248 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Thu, 10 Dec 2020 01:59:33 -0800 Subject: [PATCH 5/7] Removes all uses of non-unified memory and SHM regions Let's just delete the whole thing! --- External/FEXCore/Source/CMakeLists.txt | 2 - .../Source/Interface/Config/Config.cpp | 6 - .../Source/Interface/Context/Context.cpp | 9 - .../Source/Interface/Context/Context.h | 7 - .../Source/Interface/Core/BlockCache.cpp | 1 - .../Source/Interface/Core/BlockCache.h | 2 - .../FEXCore/Source/Interface/Core/Core.cpp | 68 +----- .../Source/Interface/Core/GdbServer.cpp | 3 - .../Interface/Core/OpcodeDispatcher.cpp | 6 +- .../FEXCore/Source/Interface/HLE/Syscalls.cpp | 91 +------ .../FEXCore/Source/Interface/HLE/Syscalls.h | 8 +- .../Source/Interface/HLE/Syscalls/Thread.cpp | 2 - .../Source/Interface/HLE/Thunks/Thunks.cpp | 9 - .../Source/Interface/HLE/x64/Memory.cpp | 5 - .../Source/Interface/Memory/MemMapper.cpp | 84 ------- .../Source/Interface/Memory/MemMapper.h | 52 ---- .../Source/Interface/Memory/SharedMem.cpp | 62 ----- .../Source/Interface/Memory/SharedMem.h | 13 - .../Source/Utils/ELFSymbolDatabase.cpp | 4 +- .../FEXCore/include/FEXCore/Config/Config.h | 1 - .../FEXCore/include/FEXCore/Core/CodeLoader.h | 13 +- .../FEXCore/include/FEXCore/Core/Context.h | 12 - .../include/FEXCore/Debug/ContextDebug.h | 3 - .../include/FEXCore/Memory/MemMapper.h | 15 -- .../include/FEXCore/Memory/SharedMem.h | 27 --- .../include/FEXCore/Utils/ELFSymbolDatabase.h | 2 +- Source/Common/ArgumentLoader.cpp | 10 - Source/CommonCore/HostFactory.cpp | 1 - Source/Tests/ELFLoader.cpp | 10 - Source/Tests/HarnessHelpers.h | 117 ++++----- Source/Tests/IRLoader.cpp | 24 +- Source/Tests/IRLoader/Loader.h | 8 +- Source/Tests/TestHarness.cpp | 9 - Source/Tests/TestHarnessRunner.cpp | 6 - Source/Tools/Debugger/IMGui_I.cpp | 226 +++++++++--------- Source/Tools/Debugger/Main.cpp | 10 - 36 files changed, 195 insertions(+), 733 deletions(-) delete mode 100644 External/FEXCore/Source/Interface/Memory/MemMapper.cpp delete mode 100644 External/FEXCore/Source/Interface/Memory/MemMapper.h delete mode 100644 External/FEXCore/Source/Interface/Memory/SharedMem.cpp delete mode 100644 External/FEXCore/Source/Interface/Memory/SharedMem.h delete mode 100644 External/FEXCore/include/FEXCore/Memory/MemMapper.h delete mode 100644 External/FEXCore/include/FEXCore/Memory/SharedMem.h diff --git a/External/FEXCore/Source/CMakeLists.txt b/External/FEXCore/Source/CMakeLists.txt index 36fa0929a..0e26133bc 100644 --- a/External/FEXCore/Source/CMakeLists.txt +++ b/External/FEXCore/Source/CMakeLists.txt @@ -190,8 +190,6 @@ set (SRCS Interface/HLE/Syscalls/NotImplemented.cpp Interface/HLE/Syscalls/Stubs.cpp Interface/HLE/Thunks/Thunks.cpp - Interface/Memory/MemMapper.cpp - Interface/Memory/SharedMem.cpp Interface/IR/IR.cpp Interface/IR/IREmitter.cpp Interface/IR/PassManager.cpp diff --git a/External/FEXCore/Source/Interface/Config/Config.cpp b/External/FEXCore/Source/Interface/Config/Config.cpp index 2e850a613..159b48b49 100644 --- a/External/FEXCore/Source/Interface/Config/Config.cpp +++ b/External/FEXCore/Source/Interface/Config/Config.cpp @@ -26,9 +26,6 @@ namespace FEXCore::Config { case FEXCore::Config::CONFIG_GDBSERVER: Config != 0 ? CTX->StartGdbServer() : CTX->StopGdbServer(); break; - case FEXCore::Config::CONFIG_UNIFIED_MEMORY: - CTX->Config.UnifiedMemory = Config != 0; - break; case FEXCore::Config::CONFIG_IS64BIT_MODE: CTX->Config.Is64BitMode = Config != 0; break; @@ -85,9 +82,6 @@ namespace FEXCore::Config { case FEXCore::Config::CONFIG_GDBSERVER: return CTX->GetGdbServerStatus(); break; - case FEXCore::Config::CONFIG_UNIFIED_MEMORY: - return CTX->Config.UnifiedMemory; - break; case FEXCore::Config::CONFIG_IS64BIT_MODE: return CTX->Config.Is64BitMode; break; diff --git a/External/FEXCore/Source/Interface/Context/Context.cpp b/External/FEXCore/Source/Interface/Context/Context.cpp index 37b016160..bb444b940 100644 --- a/External/FEXCore/Source/Interface/Context/Context.cpp +++ b/External/FEXCore/Source/Interface/Context/Context.cpp @@ -26,11 +26,6 @@ namespace FEXCore::Context { delete CTX; } - bool AddGuestMemoryRegion(FEXCore::Context::Context *CTX, FEXCore::SHM::SHMObject *SHM) { - CTX->MemoryMapper.SetBaseRegion(SHM); - return true; - } - void SetApplicationFile(FEXCore::Context::Context *CTX, std::string const &File) { CTX->SyscallHandler->SetFilename(File); // XXX: This isn't good for debugging @@ -134,10 +129,6 @@ namespace Debug { return CTX->GetCPUState(); } - void GetMemoryRegions(FEXCore::Context::Context *CTX, std::vector *Regions) { - return CTX->GetMemoryRegions(Regions); - } - bool GetDebugDataForRIP(FEXCore::Context::Context *CTX, uint64_t RIP, FEXCore::Core::DebugData *Data) { return CTX->GetDebugDataForRIP(RIP, Data); } diff --git a/External/FEXCore/Source/Interface/Context/Context.h b/External/FEXCore/Source/Interface/Context/Context.h index da5c2398c..9e02eb3fe 100644 --- a/External/FEXCore/Source/Interface/Context/Context.h +++ b/External/FEXCore/Source/Interface/Context/Context.h @@ -7,7 +7,6 @@ #include "Interface/Core/SignalDelegator.h" #include "Interface/Core/X86HelperGen.h" #include "Interface/HLE/Syscalls.h" -#include "Interface/Memory/MemMapper.h" #include "Interface/IR/PassManager.h" #include #include @@ -54,7 +53,6 @@ namespace FEXCore::Context { CoreRunningMode RunningMode {CoreRunningMode::MODE_RUN}; FEXCore::Config::ConfigCore Core {FEXCore::Config::CONFIG_INTERPRETER}; bool GdbServer {false}; - bool UnifiedMemory {true}; std::string RootFSPath; std::string ThunkLibsPath; @@ -69,7 +67,6 @@ namespace FEXCore::Context { } Config; - FEXCore::Memory::MemMapper MemoryMapper; FEXCore::HostFeatures HostFeatures; std::mutex ThreadCreationMutex; @@ -129,7 +126,6 @@ namespace FEXCore::Context { uint64_t GetThreadCount() const; FEXCore::Core::RuntimeStats *GetRuntimeStatsForThread(uint64_t Thread); FEXCore::Core::CPUState GetCPUState(); - void GetMemoryRegions(std::vector *Regions); bool GetDebugDataForRIP(uint64_t RIP, FEXCore::Core::DebugData *Data); bool FindHostCodeForRIP(uint64_t RIP, uint8_t **Code); @@ -161,9 +157,6 @@ namespace FEXCore::Context { private: void WaitForIdleWithTimeout(); - void *MapRegion(FEXCore::Core::InternalThreadState *Thread, uint64_t Offset, uint64_t Size, bool Fixed = false, bool RelativeToBase = true); - void *ShmBase(); - void MirrorRegion(FEXCore::Core::InternalThreadState *Thread, void *HostPtr, uint64_t Offset, uint64_t Size); void ExecutionThread(FEXCore::Core::InternalThreadState *Thread); void NotifyPause(); diff --git a/External/FEXCore/Source/Interface/Core/BlockCache.cpp b/External/FEXCore/Source/Interface/Core/BlockCache.cpp index 4ba00362d..17860b464 100644 --- a/External/FEXCore/Source/Interface/Core/BlockCache.cpp +++ b/External/FEXCore/Source/Interface/Core/BlockCache.cpp @@ -29,7 +29,6 @@ BlockCache::BlockCache(FEXCore::Context::Context *CTX) PageMemory = reinterpret_cast(mmap(nullptr, CODE_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); LogMan::Throw::A(PageMemory != -1ULL, "Failed to allocate page memory"); - MemoryBase = ctx->MemoryMapper.GetBaseOffset(0); VirtualMemSize = ctx->Config.VirtualMemSize; } diff --git a/External/FEXCore/Source/Interface/Core/BlockCache.h b/External/FEXCore/Source/Interface/Core/BlockCache.h index 8d357be69..3142610ba 100644 --- a/External/FEXCore/Source/Interface/Core/BlockCache.h +++ b/External/FEXCore/Source/Interface/Core/BlockCache.h @@ -123,8 +123,6 @@ private: size_t AllocateOffset {}; FEXCore::Context::Context *ctx; - uintptr_t MemoryBase{}; uint64_t VirtualMemSize{}; - }; } diff --git a/External/FEXCore/Source/Interface/Core/Core.cpp b/External/FEXCore/Source/Interface/Core/Core.cpp index c0644eeaf..710db48e8 100644 --- a/External/FEXCore/Source/Interface/Core/Core.cpp +++ b/External/FEXCore/Source/Interface/Core/Core.cpp @@ -26,8 +26,6 @@ #include "Interface/Core/GdbServer.h" -constexpr uint64_t STACK_OFFSET = 0xc000'0000; - namespace FEXCore::CPU { bool CreateCPUCore(FEXCore::Context::Context *CTX) { // This should be used for generating things that are shared between threads @@ -259,31 +257,11 @@ namespace FEXCore::Context { // We are the parent thread ParentThread = Thread; - uintptr_t MemoryBase = MemoryMapper.GetBaseOffset(0); - Loader->SetMemoryBase(MemoryBase, Config.UnifiedMemory); + Loader->MapMemoryRegion(); - auto MemoryMapperFunction = [&](uint64_t Base, uint64_t Size, bool Fixed, bool RelativeToBase) -> void* { - Thread->BlockCache->HintUsedRange(Base, Base); - return MapRegion(Thread, Base, Size, Fixed, RelativeToBase); - }; + Thread->State.State.gregs[X86State::REG_RSP] = Loader->SetupStack(); - Loader->MapMemoryRegion(MemoryMapperFunction); - - void *StackPointer = MapRegion(Thread, STACK_OFFSET, Loader->StackSize(), true, false); - - uint64_t GuestStack = STACK_OFFSET; - if (Config.UnifiedMemory) { - GuestStack = reinterpret_cast(StackPointer); - } - Thread->State.State.gregs[X86State::REG_RSP] = Loader->SetupStack(StackPointer, GuestStack); - - // Now let the code loader setup memory - auto MemoryWriterFunction = [&](void const *Data, uint64_t Addr, uint64_t Size) -> void { - // Writes the machine code to be emulated in to memory - memcpy(reinterpret_cast(Addr), Data, Size); - }; - - Loader->LoadMemory(MemoryWriterFunction); + Loader->LoadMemory(); Loader->GetInitLocations(&InitLocations); Thread->State.State.rip = StartingRIP = Loader->DefaultRIP(); @@ -612,12 +590,7 @@ namespace FEXCore::Context { std::tuple Context::CompileCode(FEXCore::Core::InternalThreadState *Thread, uint64_t GuestRIP) { uint8_t const *GuestCode{}; - if (Config.UnifiedMemory) { GuestCode = reinterpret_cast(GuestRIP); - } - else { - GuestCode = MemoryMapper.GetPointer(GuestRIP); - } // Do we already have this in the IR cache? auto IR = Thread->IRLists.find(GuestRIP); @@ -666,12 +639,7 @@ namespace FEXCore::Context { uintptr_t ExistingCodePtr{}; - if (Thread->CTX->Config.UnifiedMemory) { ExistingCodePtr = reinterpret_cast(Block.Entry + BlockInstructionsLength); - } - else { - ExistingCodePtr = MemoryMapper.GetPointer(Block.Entry + BlockInstructionsLength); - } memcpy(&existing, (void*)(ExistingCodePtr), DecodedInfo->InstSize); auto CodeChanged = Thread->OpDispatcher->_ValidateCode(existing, ExistingCodePtr, DecodedInfo->InstSize); @@ -951,30 +919,6 @@ namespace FEXCore::Context { Thread->State.State.rip = RIPBackup; } - void *Context::MapRegion(FEXCore::Core::InternalThreadState *Thread, uint64_t Offset, uint64_t Size, bool Fixed, bool RelativeToBase) { - void *Ptr = MemoryMapper.MapRegion(Offset, Size, Fixed, RelativeToBase); - Thread->CPUBackend->MapRegion(Ptr, Offset, Size); - Thread->FallbackBackend->MapRegion(Ptr, Offset, Size); - return Ptr; - } - - void Context::MirrorRegion(FEXCore::Core::InternalThreadState *Thread, void *HostPtr, uint64_t Offset, uint64_t Size) { - Thread->CPUBackend->MapRegion(HostPtr, Offset, Size); - Thread->FallbackBackend->MapRegion(HostPtr, Offset, Size); - } - - void *Context::ShmBase() { - return MemoryMapper.GetMemoryBase(); - } - - void Context::CopyMemoryMapping([[maybe_unused]] FEXCore::Core::InternalThreadState*, FEXCore::Core::InternalThreadState *ChildThread) { - auto Regions = MemoryMapper.MappedRegions; - for (auto const& Region : Regions) { - ChildThread->CPUBackend->MapRegion(Region.Ptr, Region.Offset, Region.Size); - ChildThread->FallbackBackend->MapRegion(Region.Ptr, Region.Offset, Region.Size); - } - } - uint64_t Context::GetThreadCount() const { return Threads.size(); } @@ -987,12 +931,6 @@ namespace FEXCore::Context { return ParentThread->State.State; } - void Context::GetMemoryRegions(std::vector *Regions) { - Regions->clear(); - Regions->resize(MemoryMapper.MappedRegions.size()); - memcpy(&Regions->at(0), &MemoryMapper.MappedRegions.at(0), sizeof(FEXCore::Memory::MemRegion) * MemoryMapper.MappedRegions.size()); - } - bool Context::GetDebugDataForRIP(uint64_t RIP, FEXCore::Core::DebugData *Data) { auto it = ParentThread->DebugData.find(RIP); if (it == ParentThread->DebugData.end()) { diff --git a/External/FEXCore/Source/Interface/Core/GdbServer.cpp b/External/FEXCore/Source/Interface/Core/GdbServer.cpp index a0bc792fb..a08ddac17 100644 --- a/External/FEXCore/Source/Interface/Core/GdbServer.cpp +++ b/External/FEXCore/Source/Interface/Core/GdbServer.cpp @@ -615,9 +615,6 @@ GdbServer::HandledPacketType GdbServer::handleMemory(std::string &packet) { // TODO: check we are in a valid memory range // Also, clamp length void* ptr = reinterpret_cast(addr); - if (!CTX->Config.UnifiedMemory) { - ptr = CTX->MemoryMapper.GetPointer(addr); - } if (write) { std::memcpy(ptr, data.data(), data.length()); diff --git a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp index 961e74712..b43be6b00 100644 --- a/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp +++ b/External/FEXCore/Source/Interface/Core/OpcodeDispatcher.cpp @@ -91,11 +91,7 @@ void OpDispatchBuilder::ThunkOp(OpcodeArgs) { uint8_t GPRSize = CTX->Config.Is64BitMode ? 8 : 4; const char *name; - if (CTX->Config.UnifiedMemory) { - name = (const char*)(Op->PC + 2); - } else { - name = CTX->MemoryMapper.GetPointer(Op->PC + 2); - } + name = (const char*)(Op->PC + 2); _Thunk( _LoadContext(GPRSize, offsetof(FEXCore::Core::CPUState, gregs[FEXCore::X86State::REG_RDI]), GPRClass), diff --git a/External/FEXCore/Source/Interface/HLE/Syscalls.cpp b/External/FEXCore/Source/Interface/HLE/Syscalls.cpp index eebcf886c..932c689e8 100644 --- a/External/FEXCore/Source/Interface/HLE/Syscalls.cpp +++ b/External/FEXCore/Source/Interface/HLE/Syscalls.cpp @@ -24,7 +24,6 @@ constexpr uint64_t PAGE_SIZE = 4096; -#define BRK_BASE 0xd000'0000 #define BRK_SIZE 0x1000'0000 namespace FEXCore { @@ -33,8 +32,7 @@ uint64_t SyscallHandler::HandleBRK(FEXCore::Core::InternalThreadState *Thread, v uint64_t Result; if (DataSpace == 0) { - // XXX: We need to setup our default BRK space first - DefaultProgramBreak(Thread, BRK_BASE); + DefaultProgramBreak(Thread); } if (Addr == nullptr) { // Just wants to get the location of the program break atm @@ -50,7 +48,7 @@ uint64_t SyscallHandler::HandleBRK(FEXCore::Core::InternalThreadState *Thread, v } else { uint64_t NewSize = NewEnd - DataSpace; - + // make sure we don't overflow to TLS storage if (NewSize >= BRK_SIZE) return -ENOMEM; @@ -62,90 +60,9 @@ uint64_t SyscallHandler::HandleBRK(FEXCore::Core::InternalThreadState *Thread, v return Result; } -uint64_t SyscallHandler::HandleMMAP(FEXCore::Core::InternalThreadState *Thread, void *addr, size_t length, int prot, int flags, int fd, off_t offset) { - std::lock_guard lk(MMapMutex); - - uint64_t Base = AlignDown(LastMMAP, PAGE_SIZE); - uint64_t Size = AlignUp(length, PAGE_SIZE); - if (length == 0) { - return -EINVAL; - } - if ((LastMMAP + length) >= ENDMMAP) { - LogMan::Msg::D("uhoh, mmap failed\n"); - return -ENOMEM; - } - - if (flags & MAP_FIXED) { - Base = reinterpret_cast(addr); - if (fd != -1) { - auto Name = FM.FindFDName(fd); - if (Name) { - LogMan::Msg::D("Mapping File to [0x%lx, 0x%lx) -> '%s' -> %p", Base, Base + Size, Name->c_str(), Base); - } - } - - void *Res{}; - if (fd != -1) { - Res = mmap(addr, length, prot, flags, fd, offset); - if (Res == MAP_FAILED) { - LogMan::Msg::A("Couldn't map file to %p\n", addr); - } - } - else { - Res = mmap(addr, length, prot, flags, fd, offset); - } - - if (Res == MAP_FAILED) { - return -errno; - } - - return Base; - } - else { - // If we are running unified memory then we want to be after our base - // This makes code page loading less of a burden - Base = CTX->MemoryMapper.GetBaseOffset(LastMMAP); - - void *HostPtr = reinterpret_cast(Base); - if (fd != -1) { - auto Name = FM.FindFDName(fd); - if (Name) { - LogMan::Msg::D("Mapping File to [0x%lx, 0x%lx) -> '%s' -> %p", Base, Base + Size, Name->c_str(), HostPtr); - } - } - - void *Res{}; - if (fd != -1) { - Res = mmap(HostPtr, length, prot, flags | MAP_FIXED, fd, offset); - if (Res == MAP_FAILED) { - perror(nullptr); - LogMan::Msg::A("Couldn't map file to %p. error %d(%s)\n", HostPtr, errno, strerror(errno)); - } - else { - } - } - else { - Res = mmap(HostPtr, length, prot, flags | MAP_FIXED, fd, offset); - } - - if (Res == MAP_FAILED) { - return -errno; - } - - LastMMAP += Size; - return Base; - } -} - -void SyscallHandler::DefaultProgramBreak(FEXCore::Core::InternalThreadState *Thread, uint64_t Addr) { +void SyscallHandler::DefaultProgramBreak(FEXCore::Core::InternalThreadState *Thread) { DataSpaceSize = 0; - // Just allocate 16MB of data memory past the default program break location at this point - CTX->MapRegion(Thread, Addr, BRK_SIZE, true); - - Addr += CTX->MemoryMapper.GetBaseOffset(0); - - DataSpace = Addr; - DefaultProgramBreakAddress = Addr; + DataSpace = (uint64_t)mmap(nullptr, BRK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); } SyscallHandler::SyscallHandler(FEXCore::Context::Context *ctx) diff --git a/External/FEXCore/Source/Interface/HLE/Syscalls.h b/External/FEXCore/Source/Interface/HLE/Syscalls.h index 162b1af5e..94287d961 100644 --- a/External/FEXCore/Source/Interface/HLE/Syscalls.h +++ b/External/FEXCore/Source/Interface/HLE/Syscalls.h @@ -25,7 +25,7 @@ public: virtual uint64_t HandleSyscall(FEXCore::Core::InternalThreadState *Thread, FEXCore::HLE::SyscallArguments *Args) = 0; - void DefaultProgramBreak(FEXCore::Core::InternalThreadState *Thread, uint64_t Addr); + void DefaultProgramBreak(FEXCore::Core::InternalThreadState *Thread); void SetFilename(std::string const &File) { FM.SetFilename(File); } std::string const & GetFilename() const { return FM.GetFilename(); } @@ -60,7 +60,6 @@ public: } uint64_t HandleBRK(FEXCore::Core::InternalThreadState *Thread, void *Addr); - uint64_t HandleMMAP(FEXCore::Core::InternalThreadState *Thread, void *addr, size_t length, int prot, int flags, int fd, off_t offset); FileManager FM; @@ -78,11 +77,6 @@ protected: // BRK management uint64_t DataSpace {}; uint64_t DataSpaceSize {}; - uint64_t DefaultProgramBreakAddress {}; - - // MMap management - uint64_t LastMMAP = 0x1'0000'0000; - uint64_t ENDMMAP = 0x2'0000'0000; private: diff --git a/External/FEXCore/Source/Interface/HLE/Syscalls/Thread.cpp b/External/FEXCore/Source/Interface/HLE/Syscalls/Thread.cpp index bef364790..65e56d860 100644 --- a/External/FEXCore/Source/Interface/HLE/Syscalls/Thread.cpp +++ b/External/FEXCore/Source/Interface/HLE/Syscalls/Thread.cpp @@ -45,8 +45,6 @@ namespace FEXCore::HLE { bool Is64Bit = Thread->CTX->Config.Is64BitMode; auto NewThread = Thread->CTX->CreateThread(&NewThreadState, reinterpret_cast(parent_tid)); - Thread->CTX->CopyMemoryMapping(Thread, NewThread); - Thread->CTX->InitializeThread(NewThread); if (Is64Bit) { diff --git a/External/FEXCore/Source/Interface/HLE/Thunks/Thunks.cpp b/External/FEXCore/Source/Interface/HLE/Thunks/Thunks.cpp index b782e44c3..a00f635fd 100644 --- a/External/FEXCore/Source/Interface/HLE/Thunks/Thunks.cpp +++ b/External/FEXCore/Source/Interface/HLE/Thunks/Thunks.cpp @@ -49,18 +49,9 @@ namespace FEXCore { auto CTX = Thread->CTX; - if (!CTX->Config.UnifiedMemory) { - Args = CTX->MemoryMapper.GetPointer((uintptr_t)Args); - } - auto Name = Args->Name; auto CallbackThunks = Args->CallbackThunks; - if (!CTX->Config.UnifiedMemory) { - Name = CTX->MemoryMapper.GetPointer((uintptr_t)Name); - CallbackThunks = CTX->MemoryMapper.GetPointer(CallbackThunks); - } - auto SOName = CTX->Config.ThunkLibsPath + "/" + (const char*)Name + "-host.so"; LogMan::Msg::D("Load lib: %s -> %s", Name, SOName.c_str()); diff --git a/External/FEXCore/Source/Interface/HLE/x64/Memory.cpp b/External/FEXCore/Source/Interface/HLE/x64/Memory.cpp index 9542fc510..68b2ac7c4 100644 --- a/External/FEXCore/Source/Interface/HLE/x64/Memory.cpp +++ b/External/FEXCore/Source/Interface/HLE/x64/Memory.cpp @@ -5,7 +5,6 @@ #include #include -#define MEM_PASSTHROUGH namespace FEXCore::HLE::x64 { void RegisterMemory() { REGISTER_SYSCALL_IMPL_X64(munmap, [](FEXCore::Core::InternalThreadState *Thread, void *addr, size_t length) -> uint64_t { @@ -14,12 +13,8 @@ namespace FEXCore::HLE::x64 { }); REGISTER_SYSCALL_IMPL_X64(mmap, [](FEXCore::Core::InternalThreadState *Thread, void *addr, size_t length, int prot, int flags, int fd, off_t offset) -> uint64_t { - #ifdef MEM_PASSTHROUGH uint64_t Result = reinterpret_cast(::mmap(addr, length, prot, flags, fd, offset)); SYSCALL_ERRNO(); - #else - return Thread->CTX->SyscallHandler->HandleMMAP(Thread, addr, length, prot, flags, fd, offset); - #endif }); REGISTER_SYSCALL_IMPL_X64(mremap, [](FEXCore::Core::InternalThreadState *Thread, void *old_address, size_t old_size, size_t new_size, int flags, void *new_address) -> uint64_t { diff --git a/External/FEXCore/Source/Interface/Memory/MemMapper.cpp b/External/FEXCore/Source/Interface/Memory/MemMapper.cpp deleted file mode 100644 index 9dc1c4308..000000000 --- a/External/FEXCore/Source/Interface/Memory/MemMapper.cpp +++ /dev/null @@ -1,84 +0,0 @@ -#include -#include "Interface/Memory/MemMapper.h" -#include -#include -#include - -namespace FEXCore::Memory { - - void *MemMapper::MapRegion(uint64_t Offset, size_t Size, bool Fixed, bool RelativeToBase) { - return MapRegion(Offset, Size, PROT_READ | PROT_WRITE, Fixed, RelativeToBase); - } - - void *MemMapper::ChangeMappedRegion(uint64_t Offset, size_t Size, uint32_t Flags, bool Fixed, bool RelativeToBase) { - uintptr_t PtrOffset = Offset; - - if (RelativeToBase) { - PtrOffset = reinterpret_cast(SHM->Object.Ptr) + Offset; - } - - void *Ptr = mmap(reinterpret_cast(PtrOffset), Size, Flags, - MAP_POPULATE | MAP_PRIVATE | (Fixed ? MAP_FIXED : 0), SHM->SHMFD, Offset); - - if (Ptr == MAP_FAILED) { - LogMan::Msg::A("Failed to map memory region [0x%lx, 0x%lx)", Offset, Offset + Size); - return nullptr; - } - - return Ptr; - } - - void *MemMapper::MapRegion(uint64_t Offset, size_t Size, uint32_t Flags, bool Fixed, bool RelativeToBase) { - uintptr_t PtrOffset = Offset; - - if (RelativeToBase) { - PtrOffset = reinterpret_cast(SHM->Object.Ptr) + Offset; - } - - void *Ptr = mmap(reinterpret_cast(PtrOffset), Size, Flags, - MAP_PRIVATE | (Fixed ? MAP_FIXED : 0), SHM->SHMFD, Offset); - - if (Ptr == MAP_FAILED) { - LogMan::Msg::A("Failed to map memory region [0x%lx, 0x%lx)", Offset, Offset + Size); - return nullptr; - } - - MappedRegions.emplace_back(MemRegion{Ptr, Offset, Size}); - - return Ptr; - } - - void MemMapper::UnmapRegion(void *Ptr, size_t Size) { - auto it = std::find(MappedRegions.begin(), MappedRegions.end(), Ptr); - if (it != MappedRegions.end()) { - munmap(Ptr, Size); - MappedRegions.erase(it); - } - } - - void *MemMapper::GetPointer(uint64_t Offset) { - for (auto const &Region : MappedRegions) { - if (Region.contains(Offset)) { - return reinterpret_cast(reinterpret_cast(Region.Ptr) + (Offset - Region.Offset)); - } - } - - return nullptr; - } - -#ifndef NDEBUG - void *MemMapper::GetPointerSizeCheck(uint64_t Offset, uint64_t Size) { - for (auto const &Region : MappedRegions) { - if (Region.contains(Offset)) { - LogMan::Throw::A((Region.Offset + Region.Size) >= (Offset + Size), "Pointer in region but region isn't large enough. Needs 0x%lx more", Offset - Region.Offset + Size - Region.Size); - if ((Region.Offset + Region.Size) >= (Offset + Size)) { - return reinterpret_cast(reinterpret_cast(Region.Ptr) + (Offset - Region.Offset)); - } - } - } - return nullptr; - } -#endif - -} - diff --git a/External/FEXCore/Source/Interface/Memory/MemMapper.h b/External/FEXCore/Source/Interface/Memory/MemMapper.h deleted file mode 100644 index 4b2b09c22..000000000 --- a/External/FEXCore/Source/Interface/Memory/MemMapper.h +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once -#include "Interface/Memory/SharedMem.h" -#include -#include -#include - -namespace FEXCore::Context { -struct Context; -} - -namespace FEXCore::Memory { - - class MemMapper final { - friend struct FEXCore::Context::Context; - public: - void SetBaseRegion(FEXCore::SHM::SHMObject *NewSHM) { - SHM = reinterpret_cast(NewSHM); - } - size_t GetSHMSize() const { - return SHM->Size; - } - - void *MapRegion(uint64_t Offset, size_t Size, bool Fixed = true, bool RelativeToBase = true); - void *MapRegion(uint64_t Offset, size_t Size, uint32_t Flags, bool Fixed = true, bool RelativeToBase = true); - void *ChangeMappedRegion(uint64_t Offset, size_t Size, uint32_t Flags, bool Fixed = true, bool RelativeToBase = true); - - void UnmapRegion(void *Ptr, size_t Size); - - void *GetMemoryBase() { return SHM->Object.Ptr; } - - void *GetPointer(uint64_t Offset); -#ifndef NDEBUG - void *GetPointerSizeCheck(uint64_t Offset, uint64_t Size); -#else - void *GetPointerSizeCheck(uint64_t Offset, uint64_t Size) { return GetPointer(Offset); } -#endif - template - T GetPointer(uint64_t Offset) { - return reinterpret_cast(GetPointer(Offset)); - } - - template - T GetBaseOffset(uint64_t Offset) { - return reinterpret_cast((reinterpret_cast(GetMemoryBase()) + Offset)); - } - - private: - FEXCore::SHM::InternalSHMObject *SHM; - std::vector MappedRegions{}; - }; -} - diff --git a/External/FEXCore/Source/Interface/Memory/SharedMem.cpp b/External/FEXCore/Source/Interface/Memory/SharedMem.cpp deleted file mode 100644 index d0015ba3e..000000000 --- a/External/FEXCore/Source/Interface/Memory/SharedMem.cpp +++ /dev/null @@ -1,62 +0,0 @@ -#include -#include "Interface/Memory/SharedMem.h" -#include -#include -#include -#include -#include -#include -#include - -namespace FEXCore::SHM { - void *MapRegionFlags(InternalSHMObject *SHM, size_t Offset, size_t Size, uint32_t flags, bool Fixed) { - uintptr_t PtrOffset = reinterpret_cast(SHM->Object.Ptr) + Offset; - - void *Ptr = mmap(reinterpret_cast(PtrOffset), Size, flags, - MAP_NORESERVE | MAP_PRIVATE | (Fixed ? MAP_FIXED : 0), SHM->SHMFD, Offset); - if (Ptr == MAP_FAILED) { - LogMan::Msg::A("Failed to map memory region [0x%lx, 0x%lx)", Offset, Offset + Size); - return nullptr; - } - - return Ptr; - } - - SHMObject *AllocateSHMRegion(size_t Size) { - InternalSHMObject *SHM = new InternalSHMObject{}; - const std::string SHMName = "FEXCore" + std::to_string(getpid()); - - SHM->SHMFD = shm_open(SHMName.c_str(), O_RDWR | O_CREAT | O_EXCL, 0600); - if (SHM->SHMFD == -1) { - LogMan::Msg::E("Couldn't open SHM"); - goto err; - } - - // Unlink the SHM file immediately so it doesn't get left around - shm_unlink(SHMName.c_str()); - - // Extend the SHM to the size we requested - if (ftruncate(SHM->SHMFD, Size) != 0) { - LogMan::Msg::E("Couldn't set SHM size"); - goto err; - } - - SHM->Object.Ptr = MapRegionFlags(SHM, 0, Size, PROT_READ | PROT_WRITE, false); - SHM->Size = Size; - if (SHM->Object.Ptr == nullptr) { - goto err; - } - - return &SHM->Object; -err: - delete SHM; - return nullptr; - } - - void DestroyRegion(SHMObject *SHM) { - InternalSHMObject *Obj = reinterpret_cast(SHM); - close(Obj->SHMFD); - delete Obj; - } - -} diff --git a/External/FEXCore/Source/Interface/Memory/SharedMem.h b/External/FEXCore/Source/Interface/Memory/SharedMem.h deleted file mode 100644 index d7fbdae22..000000000 --- a/External/FEXCore/Source/Interface/Memory/SharedMem.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once - -#include -#include -#include - -namespace FEXCore::SHM { - struct InternalSHMObject { - SHMObject Object; - int SHMFD; - size_t Size; - }; -} diff --git a/External/FEXCore/Source/Utils/ELFSymbolDatabase.cpp b/External/FEXCore/Source/Utils/ELFSymbolDatabase.cpp index 52eedec93..ac6369181 100644 --- a/External/FEXCore/Source/Utils/ELFSymbolDatabase.cpp +++ b/External/FEXCore/Source/Utils/ELFSymbolDatabase.cpp @@ -229,12 +229,12 @@ void ELFSymbolDatabase::FillSymbols() { } -void ELFSymbolDatabase::MapMemoryRegions(std::function Mapper) { +void ELFSymbolDatabase::MapMemoryRegions(std::function Mapper) { auto Map = [&](ELFInfo& ELF) { uint64_t ELFBase = std::get<0>(ELF.CustomLayout); uint64_t ELFSize = std::get<2>(ELF.CustomLayout); uint64_t OffsetFromBase = ELFBase - ELF.GuestBase; - ELF.ELFBase = static_cast(Mapper(ELFBase, ELFSize, true, false)) - OffsetFromBase; + ELF.ELFBase = static_cast(Mapper(ELFBase, ELFSize)) - OffsetFromBase; }; Map(LocalInfo); diff --git a/External/FEXCore/include/FEXCore/Config/Config.h b/External/FEXCore/include/FEXCore/Config/Config.h index fe3b00149..2531e87bd 100644 --- a/External/FEXCore/include/FEXCore/Config/Config.h +++ b/External/FEXCore/include/FEXCore/Config/Config.h @@ -15,7 +15,6 @@ namespace FEXCore::Config { CONFIG_GDBSERVER, CONFIG_ROOTFSPATH, CONFIG_THUNKLIBSPATH, - CONFIG_UNIFIED_MEMORY, CONFIG_IS64BIT_MODE, CONFIG_EMULATED_CPU_CORES, CONFIG_TSO_ENABLED, diff --git a/External/FEXCore/include/FEXCore/Core/CodeLoader.h b/External/FEXCore/include/FEXCore/Core/CodeLoader.h index 14c0f8cb2..23882f254 100644 --- a/External/FEXCore/include/FEXCore/Core/CodeLoader.h +++ b/External/FEXCore/include/FEXCore/Core/CodeLoader.h @@ -32,7 +32,7 @@ public: * * Probably will be GuestPtr + StackSize() - */ - virtual uint64_t SetupStack(void *HostPtr, uint64_t GuestPtr) const = 0; + virtual uint64_t SetupStack() const = 0; /** * @brief Function to return the guest RIP that the code should start out at @@ -41,12 +41,6 @@ public: virtual void GetInitLocations(std::vector *Locations) {} - /** - * @brief Lets the core tell the CodeLoader where the virtual memory region starts and if we are running in an environment - * where host and guest code is unified in a single address space - */ - virtual void SetMemoryBase(uint64_t Base, bool Unified) {} - /** * @brief Allows the loader to map memory regions that it needs * @@ -54,7 +48,7 @@ public: * * @param Mapper Returns the host facing pointer for memory setup if the codfe loader needs to do things to it */ - virtual void MapMemoryRegion(std::function Mapper) {} + virtual void MapMemoryRegion() {} /** * @brief Memory writer function for loading code in to guest memory @@ -63,8 +57,7 @@ public: * Second argument = Guest memory data location * Third argument = Guest memory size */ - using MemoryWriter = std::function; - virtual void LoadMemory(MemoryWriter Writer) = 0; + virtual void LoadMemory() = 0; /** * @brief Get the final RIP we are supposed to end up on in a debugger diff --git a/External/FEXCore/include/FEXCore/Core/Context.h b/External/FEXCore/include/FEXCore/Core/Context.h index dfd0a9c1f..fecc46928 100644 --- a/External/FEXCore/include/FEXCore/Core/Context.h +++ b/External/FEXCore/include/FEXCore/Core/Context.h @@ -22,9 +22,6 @@ namespace FEXCore::HLE { struct SyscallArguments; class SyscallVisitor; } -namespace FEXCore::SHM { - struct SHMObject; -} namespace FEXCore::Context { struct Context; @@ -74,15 +71,6 @@ namespace FEXCore::Context { */ void DestroyContext(FEXCore::Context::Context *CTX); - /** - * @brief Adds a base pointer that the VM can use for "physical" memory backing - * - * Will be the guests physical memory location of zero - * - * @return true on added. false when we had already added a guest memory region - */ - bool AddGuestMemoryRegion(FEXCore::Context::Context *CTX, FEXCore::SHM::SHMObject *SHM); - /** * @brief Allows setting up in memory code and other things prior to launchign code execution * diff --git a/External/FEXCore/include/FEXCore/Debug/ContextDebug.h b/External/FEXCore/include/FEXCore/Debug/ContextDebug.h index 59643b5c6..cc191bb81 100644 --- a/External/FEXCore/include/FEXCore/Debug/ContextDebug.h +++ b/External/FEXCore/include/FEXCore/Debug/ContextDebug.h @@ -1,6 +1,5 @@ #pragma once #include -#include #include #include @@ -21,8 +20,6 @@ namespace Debug { FEXCore::Core::RuntimeStats *GetRuntimeStatsForThread(FEXCore::Context::Context *CTX, uint64_t Thread); FEXCore::Core::CPUState GetCPUState(FEXCore::Context::Context *CTX); - void GetMemoryRegions(FEXCore::Context::Context *CTX, std::vector *Regions); - bool GetDebugDataForRIP(FEXCore::Context::Context *CTX, uint64_t RIP, FEXCore::Core::DebugData *Data); bool FindHostCodeForRIP(FEXCore::Context::Context *CTX, uint64_t RIP, uint8_t **Code); // XXX: diff --git a/External/FEXCore/include/FEXCore/Memory/MemMapper.h b/External/FEXCore/include/FEXCore/Memory/MemMapper.h deleted file mode 100644 index bc4558508..000000000 --- a/External/FEXCore/include/FEXCore/Memory/MemMapper.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once -#include -#include - -namespace FEXCore::Memory { - struct MemRegion { - void *Ptr; - size_t Offset; - size_t Size; - - bool operator==(void *rhs) const { return Ptr == rhs; } - bool contains(uint64_t Addr) const { return Addr >= Offset && Addr < (Offset + Size); } - }; -} - diff --git a/External/FEXCore/include/FEXCore/Memory/SharedMem.h b/External/FEXCore/include/FEXCore/Memory/SharedMem.h deleted file mode 100644 index 8961f32d2..000000000 --- a/External/FEXCore/include/FEXCore/Memory/SharedMem.h +++ /dev/null @@ -1,27 +0,0 @@ -#pragma once -#include -#include - -namespace FEXCore::SHM { - - struct SHMObject { - void *Ptr; - uint8_t InternalState[0]; - }; - - /** - * @brief Allocate a shared memory region that will be the base of our VM's memory - * - * @param Size The size of the SHM region - * - * @return An object representing our internal SHM state - */ - SHMObject *AllocateSHMRegion(size_t Size); - - /** - * @brief Destroy the SHM region - * - * @param SHM The region previously created with AllocateSHMRegion - */ - void DestroyRegion(SHMObject *SHM); -} diff --git a/External/FEXCore/include/FEXCore/Utils/ELFSymbolDatabase.h b/External/FEXCore/include/FEXCore/Utils/ELFSymbolDatabase.h index bb0d334bf..5931f2838 100644 --- a/External/FEXCore/include/FEXCore/Utils/ELFSymbolDatabase.h +++ b/External/FEXCore/include/FEXCore/Utils/ELFSymbolDatabase.h @@ -11,7 +11,7 @@ public: uint64_t GetElfBase() const; - void MapMemoryRegions(std::function Mapper); + void MapMemoryRegions(std::function Mapper); void WriteLoadableSections(::ELFLoader::ELFContainer::MemoryWriter Writer); uint64_t DefaultRIP() const; diff --git a/Source/Common/ArgumentLoader.cpp b/Source/Common/ArgumentLoader.cpp index 6d451c6f4..7f92c39d4 100644 --- a/Source/Common/ArgumentLoader.cpp +++ b/Source/Common/ArgumentLoader.cpp @@ -104,11 +104,6 @@ namespace FEX::ArgLoader { .dest("ThunkLibs") .help("Folder to find the host-side thunking libs"); - EmulationGroup.add_option("-U", "--unified-memory") - .dest("UnifiedMemory") - .action("store_true") - .help("Enable unified memory for the emulator"); - EmulationGroup.add_option("-E", "--env") .dest("Env") .help("Adds an environment variable") @@ -241,11 +236,6 @@ namespace FEX::ArgLoader { Set(FEXCore::Config::ConfigOption::CONFIG_THUNKLIBSPATH, Option); } - if (Options.is_set_by_user("UnifiedMemory")) { - bool Option = Options.get("UnifiedMemory"); - Set(FEXCore::Config::ConfigOption::CONFIG_UNIFIED_MEMORY, std::to_string(Option)); - } - if (Options.is_set_by_user("Env")) { for (auto iter = Options.all("Env").begin(); iter != Options.all("Env").end(); ++iter) { Set(FEXCore::Config::ConfigOption::CONFIG_ENVIRONMENT, *iter); diff --git a/Source/CommonCore/HostFactory.cpp b/Source/CommonCore/HostFactory.cpp index b54f45057..a28734605 100644 --- a/Source/CommonCore/HostFactory.cpp +++ b/Source/CommonCore/HostFactory.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include diff --git a/Source/Tests/ELFLoader.cpp b/Source/Tests/ELFLoader.cpp index 04dff7e52..51547577f 100644 --- a/Source/Tests/ELFLoader.cpp +++ b/Source/Tests/ELFLoader.cpp @@ -6,7 +6,6 @@ #include #include #include -#include #include #include @@ -230,12 +229,6 @@ int main(int argc, char **argv, char **const envp) { FEX::HarnessHelper::ELFCodeLoader Loader{Program, LDPath(), Args, ParsedArgs, envp, &Environment}; FEXCore::Context::InitializeStaticTables(Loader.Is64BitMode() ? FEXCore::Context::MODE_64BIT : FEXCore::Context::MODE_32BIT); - uint64_t VMemSize = 1ULL << 36; - if (!Loader.Is64BitMode()) { - VMemSize = 1ULL << 32; - } - - auto SHM = FEXCore::SHM::AllocateSHMRegion(VMemSize); auto CTX = FEXCore::Context::CreateNewContext(); FEXCore::Context::InitializeContext(CTX); @@ -246,7 +239,6 @@ int main(int argc, char **argv, char **const envp) { FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_GDBSERVER, GdbServerConfig()); FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_ROOTFSPATH, LDPath()); FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_THUNKLIBSPATH, ThunkLibsPath()); - FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_UNIFIED_MEMORY, true); FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_IS64BIT_MODE, Loader.Is64BitMode()); FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_EMULATED_CPU_CORES, ThreadsConfig()); FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_TSO_ENABLED, TSOEnabledConfig()); @@ -255,7 +247,6 @@ int main(int argc, char **argv, char **const envp) { FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_ABI_NO_PF, AbiNoPF()); FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_DUMPIR, DumpIR()); - FEXCore::Context::AddGuestMemoryRegion(CTX, SHM); FEXCore::Context::InitCore(CTX, &Loader); FEXCore::Context::SetApplicationFile(CTX, std::filesystem::canonical(Program)); @@ -276,7 +267,6 @@ int main(int argc, char **argv, char **const envp) { auto ProgramStatus = FEXCore::Context::GetProgramStatus(CTX); FEXCore::Context::DestroyContext(CTX); - FEXCore::SHM::DestroyRegion(SHM); FEXCore::Config::Shutdown(); diff --git a/Source/Tests/HarnessHelpers.h b/Source/Tests/HarnessHelpers.h index 400516860..5931eb892 100644 --- a/Source/Tests/HarnessHelpers.h +++ b/Source/Tests/HarnessHelpers.h @@ -276,13 +276,11 @@ namespace FEX::HarnessHelper { return regions; } - void LoadMemory(uint64_t MemoryBase, FEXCore::CodeLoader::MemoryWriter Writer) { + void LoadMemory() { uintptr_t DataOffset = BaseConfig.OptionMemDataOffset; for (unsigned i = 0; i < BaseConfig.OptionMemDataCount; ++i) { MemDataStructBase *MemData = reinterpret_cast(RawConfigFile.data() + DataOffset); - - Writer(&MemData->data, MemoryBase + MemData->address, MemData->length); - + memcpy(reinterpret_cast(MemData->address), &MemData->data, MemData->length); DataOffset += sizeof(MemDataStructBase) + MemData->length; } } @@ -345,66 +343,74 @@ namespace FEX::HarnessHelper { return STACK_SIZE; } - void SetMemoryBase(uint64_t Base, bool Unified) override { - MemoryBase = Base; - } - - uint64_t SetupStack([[maybe_unused]] void *HostPtr, uint64_t GuestPtr) const override { - return GuestPtr + STACK_SIZE - 16; + uint64_t SetupStack() const override { + if (Config.Is64BitMode()) { + return reinterpret_cast(mmap(nullptr, STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)) + STACK_SIZE; + } + else { + uint64_t Result = reinterpret_cast(mmap(reinterpret_cast(STACK_OFFSET), STACK_SIZE, PROT_READ | PROT_WRITE, MAP_FIXED_NOREPLACE | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); + LogMan::Throw::A(Result != ~0ULL, "mmap failed"); + return Result + STACK_SIZE; + } } uint64_t DefaultRIP() const override { return RIP; } - void MapMemoryRegion(std::function Mapper) override { + void MapMemoryRegion() 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_FIXED_NOREPLACE | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + LogMan::Throw::A(Result != (void*)~0ULL, "mmap failed"); + return Result; + }; + if (LimitedSize) { - Mapper(0xe000'0000, PAGE_SIZE * 10, true, false); + DoMMap(0xe000'0000, PAGE_SIZE * 10); // SIB8 // We test [-128, -126] (Bottom) // We test [-8, 8] (Middle) // We test [120, 127] (Top) // Can fit in two pages - Mapper(0xe800'0000 - PAGE_SIZE, PAGE_SIZE * 2, true, false); + DoMMap(0xe800'0000 - PAGE_SIZE, PAGE_SIZE * 2); // SIB32 Bottom // We test INT_MIN, INT_MIN + 8 - Mapper(0x2'0000'0000, PAGE_SIZE, true, false); + DoMMap(0x2'0000'0000, PAGE_SIZE); // SIB32 Middle // We test -8 + 8 - Mapper(0x2'8000'0000 - PAGE_SIZE, PAGE_SIZE * 2, true, false); + DoMMap(0x2'8000'0000 - PAGE_SIZE, PAGE_SIZE * 2); // SIB32 Top // We Test INT_MAX - 8, INT_MAX - Mapper(0x3'0000'0000 - PAGE_SIZE, PAGE_SIZE * 2, true, false); + DoMMap(0x3'0000'0000 - PAGE_SIZE, PAGE_SIZE * 2); } else { // This is scratch memory location and SIB8 location - Mapper(0xe000'0000, 0x1000'0000, true, false); + DoMMap(0xe000'0000, 0x1000'0000); // This is for large SIB 32bit displacement testing - Mapper(0x2'0000'0000, 0x1'0000'1000, true, false); + DoMMap(0x2'0000'0000, 0x1'0000'1000); } // Map in the memory region for the test file size_t Length = AlignUp(RawFile.size(), PAGE_SIZE); - Code_start_page = reinterpret_cast(Mapper(Code_start_page, Length, true, false)); + Code_start_page = reinterpret_cast(DoMMap(Code_start_page, Length)); mprotect(reinterpret_cast(Code_start_page), Length, PROT_READ | PROT_WRITE | PROT_EXEC); RIP = Code_start_page; // Map the memory regions the test file asks for for (auto& [region, size] : Config.GetMemoryRegions()) { - Mapper(region, size, true, false); + DoMMap(region, size); } } - void LoadMemory(MemoryWriter Writer) override { + void LoadMemory() override { // Memory base here starts at the start location we passed back with GetLayout() // This will write at [CODE_START_RANGE + 0, RawFile.size() ) - Writer(&RawFile.at(0), RIP, RawFile.size()); - - Config.LoadMemory(0, Writer); + memcpy(reinterpret_cast(RIP), &RawFile.at(0), RawFile.size()); + Config.LoadMemory(); } uint64_t GetFinalRIP() override { return RIP + RawFile.size(); } @@ -417,10 +423,10 @@ namespace FEX::HarnessHelper { private: constexpr static uint64_t STACK_SIZE = PAGE_SIZE; + constexpr static uint64_t STACK_OFFSET = 0xc000'0000; // Zero is special case to know when we are done uint64_t Code_start_page = 0x1'0000; uint64_t RIP {}; - uint64_t MemoryBase{}; std::vector RawFile; ConfigLoader Config; @@ -498,6 +504,11 @@ public: AuxVariables.emplace_back(auxv_t{33, 0ULL}); // sysinfo (vDSO) } + AuxVariables.emplace_back(auxv_t{3, DB.GetElfBase()}); // Program header + AuxVariables.emplace_back(auxv_t{7, DB.GetElfBase()}); // Interpreter address + AuxVariables.emplace_back(auxv_t{9, DB.DefaultRIP()}); // AT_ENTRY + AuxVariables.emplace_back(auxv_t{0, 0}); // Null ender + for (auto &Arg : ParsedArgs) { LoaderArgs.emplace_back(Arg.c_str()); } @@ -507,24 +518,9 @@ public: return STACK_SIZE; } - virtual void SetMemoryBase(uint64_t Base, bool Unified) override { - if (File.WasDynamic() && Unified) { - MemoryBase = Base; - } - else { - MemoryBase = 0; - } - // Set up our aux values here - AuxVariables.emplace_back(auxv_t{3, DB.GetElfBase()}); // Program header - AuxVariables.emplace_back(auxv_t{7, DB.GetElfBase()}); // Interpreter address - AuxVariables.emplace_back(auxv_t{9, DB.DefaultRIP()}); // AT_ENTRY - AuxVariables.emplace_back(auxv_t{0, 0}); // Null ender - } - template static void SetupPointers( uintptr_t StackPointer, - uint64_t rsp, uint64_t AuxVOffset, uint64_t ArgumentOffset, uint64_t EnvpOffset, @@ -544,8 +540,8 @@ public: // Arguments memory lives after everything else uint8_t *ArgumentBackingBase = reinterpret_cast(StackPointer + ArgumentOffset); uint8_t *EnvpBackingBase = reinterpret_cast(StackPointer + EnvpOffset); - PointerType ArgumentBackingBaseGuest = rsp + ArgumentOffset; - PointerType EnvpBackingBaseGuest = rsp + EnvpOffset; + PointerType ArgumentBackingBaseGuest = StackPointer + ArgumentOffset; + PointerType EnvpBackingBaseGuest = StackPointer + EnvpOffset; *reinterpret_cast(StackPointer + 0) = Args.size(); PadPointers[0] = 0; @@ -588,7 +584,7 @@ public: for (size_t i = 0; i < AuxVariables.size(); ++i) { if (AuxVariables[i].key == 25) { // Random value is always 128bits - AuxType Random{25, static_cast(rsp + RandomNumberOffset)}; + AuxType Random{25, static_cast(StackPointer + RandomNumberOffset)}; uint64_t *RandomLoc = reinterpret_cast(StackPointer + RandomNumberOffset); RandomLoc[0] = 0xDEAD; RandomLoc[1] = 0xDEAD2; @@ -605,10 +601,18 @@ public: *(PointerType*)(&AuxTabSize) = sizeof(AuxType) * AuxVariables.size(); } - uint64_t SetupStack(void *HostPtr, uint64_t GuestPtr) const override { - uintptr_t StackPointer = reinterpret_cast(HostPtr) + StackSize(); + uint64_t SetupStack() const override { + uintptr_t StackPointer{}; + if (File.GetMode() == ::ELFLoader::ELFContainer::MODE_64BIT) { + StackPointer = reinterpret_cast(mmap(nullptr, StackSize(), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); + } + else { + StackPointer = reinterpret_cast(mmap(reinterpret_cast(STACK_OFFSET), StackSize(), PROT_READ | PROT_WRITE, MAP_FIXED_NOREPLACE | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); + LogMan::Throw::A(StackPointer != ~0ULL, "mmap failed"); + } + + StackPointer += StackSize(); // Set up our initial CPU state - uint64_t rsp = GuestPtr + StackSize(); uint64_t SizeOfPointer = File.GetMode() == ELFLoader::ELFContainer::MODE_64BIT ? 8 : 4; uint64_t TotalArgumentMemSize{}; @@ -638,7 +642,6 @@ public: TotalArgumentMemSize += 16; // Offset the stack by how much memory we need - rsp -= TotalArgumentMemSize; StackPointer -= TotalArgumentMemSize; // Stack setup @@ -658,7 +661,6 @@ public: if (SizeOfPointer == 8) { SetupPointers( StackPointer, - rsp, AuxVOffset, ArgumentOffset, EnvpOffset, @@ -673,7 +675,6 @@ public: else { SetupPointers( StackPointer, - rsp, AuxVOffset, ArgumentOffset, EnvpOffset, @@ -686,20 +687,26 @@ public: ); } - return rsp; + return StackPointer; } uint64_t DefaultRIP() const override { return DB.DefaultRIP(); } - void MapMemoryRegion(std::function Mapper) override { - DB.MapMemoryRegions(Mapper); + void MapMemoryRegion() override { + auto DoMMap = [](uint64_t Address, size_t Size) -> void* { + void *Result = mmap(reinterpret_cast(Address), Size, PROT_READ | PROT_WRITE, MAP_FIXED_NOREPLACE | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + LogMan::Throw::A(Result != (void*)~0ULL, "Couldn't mmap"); + return Result; + }; + + DB.MapMemoryRegions(DoMMap); } - void LoadMemory(MemoryWriter Writer) override { + void LoadMemory() override { auto ELFLoaderWrapper = [&](void const *Data, uint64_t Addr, uint64_t Size) -> void { - Writer(Data, Addr, Size); + memcpy(reinterpret_cast(Addr), Data, Size); }; DB.WriteLoadableSections(ELFLoaderWrapper); } @@ -740,9 +747,9 @@ private: uint64_t AuxTabBase, AuxTabSize; uint64_t ArgumentBackingSize{}; uint64_t EnvironmentBackingSize{}; - uint64_t MemoryBase{}; constexpr static uint64_t STACK_SIZE = 8 * 1024 * 1024; + constexpr static uint64_t STACK_OFFSET = 0xc000'0000; }; } diff --git a/Source/Tests/IRLoader.cpp b/Source/Tests/IRLoader.cpp index cd7a76da1..3547a5d5a 100644 --- a/Source/Tests/IRLoader.cpp +++ b/Source/Tests/IRLoader.cpp @@ -7,7 +7,6 @@ #include #include #include -#include #include void MsgHandler(LogMan::DebugLevels Level, char const *Message) { @@ -60,25 +59,21 @@ class IRCodeLoader final : public FEXCore::CodeLoader { return STACK_SIZE; } - void SetMemoryBase(uint64_t Base, bool Unified) override { - MemoryBase = Base; - } - - uint64_t SetupStack([[maybe_unused]] void *HostPtr, uint64_t GuestPtr) const override { - return GuestPtr + STACK_SIZE - 16; + uint64_t SetupStack() const override { + return reinterpret_cast(mmap(nullptr, STACK_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)); } uint64_t DefaultRIP() const override { return IR->GetEntryRIP(); } - void MapMemoryRegion(std::function Mapper) override { + void MapMemoryRegion() override { // Map the memory regions the test file asks for - IR->MapRegions(Mapper); + IR->MapRegions(); } - void LoadMemory(MemoryWriter Writer) override { - IR->LoadMemory(MemoryBase, Writer); + void LoadMemory() override { + IR->LoadMemory(); } uint64_t GetFinalRIP() override { return 0; } @@ -90,7 +85,6 @@ class IRCodeLoader final : public FEXCore::CodeLoader { private: FEX::IRLoader::Loader *IR; constexpr static uint64_t STACK_SIZE = 8 * 1024 * 1024; - uint64_t MemoryBase = 0; }; int main(int argc, char **argv, char **const envp) { @@ -108,7 +102,6 @@ int main(int argc, char **argv, char **const envp) { FEXCore::Config::Value MultiblockConfig{FEXCore::Config::CONFIG_MULTIBLOCK, false}; FEXCore::Config::Value GdbServerConfig{FEXCore::Config::CONFIG_GDBSERVER, false}; FEXCore::Config::Value LDPath{FEXCore::Config::CONFIG_ROOTFSPATH, ""}; - FEXCore::Config::Value UnifiedMemory{FEXCore::Config::CONFIG_UNIFIED_MEMORY, false}; auto Args = FEX::ArgLoader::Get(); auto ParsedArgs = FEX::ArgLoader::GetParsedArgs(); @@ -116,7 +109,6 @@ int main(int argc, char **argv, char **const envp) { LogMan::Throw::A(Args.size() > 1, "Not enough arguments"); FEXCore::Context::InitializeStaticTables(); - auto SHM = FEXCore::SHM::AllocateSHMRegion(1ULL << 36); auto CTX = FEXCore::Context::CreateNewContext(); FEXCore::Context::InitializeContext(CTX); @@ -126,9 +118,6 @@ int main(int argc, char **argv, char **const envp) { FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_MAXBLOCKINST, BlockSizeConfig()); FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_GDBSERVER, GdbServerConfig()); FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_ROOTFSPATH, LDPath()); - FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_UNIFIED_MEMORY, UnifiedMemory()); - - FEXCore::Context::AddGuestMemoryRegion(CTX, SHM); FEX::IRLoader::InitializeStaticTables(); FEX::IRLoader::Loader Loader(Args[0], Args[1]); @@ -169,7 +158,6 @@ int main(int argc, char **argv, char **const envp) { } FEXCore::Context::DestroyContext(CTX); - FEXCore::SHM::DestroyRegion(SHM); return Return; } diff --git a/Source/Tests/IRLoader/Loader.h b/Source/Tests/IRLoader/Loader.h index 00939ffaf..e6ea110aa 100644 --- a/Source/Tests/IRLoader/Loader.h +++ b/Source/Tests/IRLoader/Loader.h @@ -40,13 +40,13 @@ namespace FEX::IRLoader { return Config.CompareStates(State, nullptr); } - void LoadMemory(uint64_t MemoryBase, FEXCore::CodeLoader::MemoryWriter Writer) { - Config.LoadMemory(MemoryBase, Writer); + void LoadMemory() { + Config.LoadMemory(); } - void MapRegions(std::function Mapper) { + void MapRegions() { for (auto& [region, size] : Config.GetMemoryRegions()) { - Mapper(region, size, true, true); + mmap(reinterpret_cast(region), size, PROT_READ | PROT_WRITE, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); } } diff --git a/Source/Tests/TestHarness.cpp b/Source/Tests/TestHarness.cpp index ffcb03372..52c755083 100644 --- a/Source/Tests/TestHarness.cpp +++ b/Source/Tests/TestHarness.cpp @@ -9,7 +9,6 @@ #include #include #include -#include #include #include @@ -60,24 +59,18 @@ int main(int argc, char **argv) { LogMan::Throw::A(Args.size() > 1, "Not enough arguments"); FEXCore::Context::InitializeStaticTables(); - auto SHM1 = FEXCore::SHM::AllocateSHMRegion(1ULL << 36); auto CTX1 = FEXCore::Context::CreateNewContext(); - auto SHM2 = FEXCore::SHM::AllocateSHMRegion(1ULL << 36); auto CTX2 = FEXCore::Context::CreateNewContext(); FEXCore::Config::SetConfig(CTX1, FEXCore::Config::CONFIG_DEFAULTCORE, FEXCore::Config::CONFIG_CUSTOM); FEXCore::Config::SetConfig(CTX1, FEXCore::Config::CONFIG_SINGLESTEP, 1); FEXCore::Config::SetConfig(CTX1, FEXCore::Config::CONFIG_MAXBLOCKINST, 1); - FEXCore::Context::AddGuestMemoryRegion(CTX1, SHM1); - FEXCore::Config::SetConfig(CTX2, FEXCore::Config::CONFIG_DEFAULTCORE, FEXCore::Config::CONFIG_INTERPRETER); FEXCore::Config::SetConfig(CTX2, FEXCore::Config::CONFIG_SINGLESTEP, 1); FEXCore::Config::SetConfig(CTX2, FEXCore::Config::CONFIG_MAXBLOCKINST, 1); - FEXCore::Context::AddGuestMemoryRegion(CTX2, SHM2); - FEXCore::Context::InitializeContext(CTX1); FEXCore::Context::InitializeContext(CTX2); @@ -102,9 +95,7 @@ int main(int argc, char **argv) { bool Passed = Loader.CompareStates(&State1, &State2); LogMan::Msg::I("Passed? %s\n", Passed ? "Yes" : "No"); - FEXCore::SHM::DestroyRegion(SHM1); FEXCore::Context::DestroyContext(CTX1); - FEXCore::SHM::DestroyRegion(SHM2); FEXCore::Context::DestroyContext(CTX2); return Passed ? 0 : 1; diff --git a/Source/Tests/TestHarnessRunner.cpp b/Source/Tests/TestHarnessRunner.cpp index db5c6c6c3..528ea9c2e 100644 --- a/Source/Tests/TestHarnessRunner.cpp +++ b/Source/Tests/TestHarnessRunner.cpp @@ -11,7 +11,6 @@ #include #include #include -#include #include #include @@ -81,10 +80,8 @@ int main(int argc, char **argv, char **const envp) { FEX::HarnessHelper::HarnessCodeLoader Loader{Args[0], Args[1].c_str()}; FEXCore::Context::InitializeStaticTables(Loader.Is64BitMode() ? FEXCore::Context::MODE_64BIT : FEXCore::Context::MODE_32BIT); - auto SHM = FEXCore::SHM::AllocateSHMRegion(1ULL << 34); auto CTX = FEXCore::Context::CreateNewContext(); - FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_UNIFIED_MEMORY, true); FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_DEFAULTCORE, CoreConfig()); FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_MULTIBLOCK, MultiblockConfig()); FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_SINGLESTEP, SingleStepConfig()); @@ -96,8 +93,6 @@ int main(int argc, char **argv, char **const envp) { FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_ABI_NO_PF, AbiNoPF()); FEXCore::Context::SetCustomCPUBackendFactory(CTX, HostFactory::CPUCreationFactory); - FEXCore::Context::AddGuestMemoryRegion(CTX, SHM); - FEXCore::Context::InitializeContext(CTX); bool Result1 = FEXCore::Context::InitCore(CTX, &Loader); @@ -114,7 +109,6 @@ int main(int argc, char **argv, char **const envp) { LogMan::Msg::I("Passed? %s\n", Passed ? "Yes" : "No"); - FEXCore::SHM::DestroyRegion(SHM); FEXCore::Context::DestroyContext(CTX); return Passed ? 0 : -1; diff --git a/Source/Tools/Debugger/IMGui_I.cpp b/Source/Tools/Debugger/IMGui_I.cpp index 71666771a..886595c8b 100644 --- a/Source/Tools/Debugger/IMGui_I.cpp +++ b/Source/Tools/Debugger/IMGui_I.cpp @@ -227,10 +227,6 @@ namespace CPUStats { } } -namespace MemoryViewer { - std::vector MappedRegions; -} - // Logging Windows namespace Logging { bool ShowLogOutput = true; @@ -393,13 +389,6 @@ namespace Disasm { } uint8_t *GetPointerFromRegions(uint64_t PC) { - for (auto &Region : MemoryViewer::MappedRegions) { - if (Region.contains(PC)) { - uint64_t Offset = PC - Region.Offset; - return reinterpret_cast(reinterpret_cast(Region.Ptr) + Offset); - } - } - return nullptr; } @@ -842,132 +831,133 @@ namespace MemoryViewer { uint64_t CurrentAddress {}; char CurrentAddressString[32]{}; bool MappedRegionGetter(void *data, int idx, const char** out_text) { - auto &Region = MappedRegions[idx]; - static char Buf[512]; - snprintf(Buf, 512, "[0x%lx, 0x%lx) - 0x%lx", Region.Offset, Region.Offset + Region.Size, Region.Size); - *out_text = Buf; - return true; + return false; + //auto &Region = MappedRegions[idx]; + //static char Buf[512]; + //snprintf(Buf, 512, "[0x%lx, 0x%lx) - 0x%lx", Region.Offset, Region.Offset + Region.Size, Region.Size); + //*out_text = Buf; + //return true; } bool MappedRegionMemoryGetter(void *data, int idx, const char** out_text) { - if (MappedRegions.empty()) - return false; + return false; + //if (MappedRegions.empty()) + // return false; - auto &Region = MappedRegions[MappedRegionsCurrentItem]; - static char Buf[512]{}; - char BufChars[17]{}; - uint8_t *Ptr = static_cast(Region.Ptr); - Ptr += idx * 16; + //auto &Region = MappedRegions[MappedRegionsCurrentItem]; + //static char Buf[512]{}; + //char BufChars[17]{}; + //uint8_t *Ptr = static_cast(Region.Ptr); + //Ptr += idx * 16; - for (int i = 0; i < 16; i++) { - if (isprint(Ptr[i])) - BufChars[i] = Ptr[i]; - else - BufChars[i] = '.'; - } + //for (int i = 0; i < 16; i++) { + // if (isprint(Ptr[i])) + // BufChars[i] = Ptr[i]; + // else + // BufChars[i] = '.'; + //} - snprintf(Buf, 512, - "%4lX > %02x %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\t%s", - Region.Offset + idx * 16, - Ptr[0], Ptr[1], Ptr[2], Ptr[3], Ptr[4], Ptr[5], Ptr[6], Ptr[7], - Ptr[8], Ptr[9], Ptr[10], Ptr[11], Ptr[12], Ptr[13], Ptr[14], Ptr[15], - BufChars - ); - *out_text = Buf; - return true; + //snprintf(Buf, 512, + // "%4lX > %02x %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\t%s", + // Region.Offset + idx * 16, + // Ptr[0], Ptr[1], Ptr[2], Ptr[3], Ptr[4], Ptr[5], Ptr[6], Ptr[7], + // Ptr[8], Ptr[9], Ptr[10], Ptr[11], Ptr[12], Ptr[13], Ptr[14], Ptr[15], + // BufChars + // ); + //*out_text = Buf; + //return true; } void Window() { - auto DisplayAddress = [&](uint64_t RIP) { - MappedRegionsCurrentItem = 0; - // First we need to find the RIP in the mapped regions - // Skip first entry because it is the full 64GB of vmem - for (size_t i = 1; i < MappedRegions.size(); ++i) { - if (MappedRegions[i].contains(RIP)) { - MappedRegionsCurrentItem = i; - break; - } - } - // Now we need to set our hex view listbox to the correct line - MappedRegionsMemoryCurrentItem = static_cast(RIP - MappedRegions[MappedRegionsCurrentItem].Offset) / 16; + //auto DisplayAddress = [&](uint64_t RIP) { + // MappedRegionsCurrentItem = 0; + // // First we need to find the RIP in the mapped regions + // // Skip first entry because it is the full 64GB of vmem + // for (size_t i = 1; i < MappedRegions.size(); ++i) { + // if (MappedRegions[i].contains(RIP)) { + // MappedRegionsCurrentItem = i; + // break; + // } + // } + // // Now we need to set our hex view listbox to the correct line + // MappedRegionsMemoryCurrentItem = static_cast(RIP - MappedRegions[MappedRegionsCurrentItem].Offset) / 16; - // Now set the Current Address textbox and string to the correct address - LogMan::Msg::D("RIP is 0x%lx", RIP); - CurrentAddress = RIP; - std::ostringstream out{}; - out << "0x" << std::hex << CurrentAddress; - strncpy(CurrentAddressString, out.str().c_str(), 32); - }; + // // Now set the Current Address textbox and string to the correct address + // LogMan::Msg::D("RIP is 0x%lx", RIP); + // CurrentAddress = RIP; + // std::ostringstream out{}; + // out << "0x" << std::hex << CurrentAddress; + // strncpy(CurrentAddressString, out.str().c_str(), 32); + //}; - if (ImGui::Begin("#Memory Viewer", &ShowMemoryWindow)) { - if (FEX::DebuggerState::ActiveCore() && !FEX::DebuggerState::IsCoreRunning()) { - FEXCore::Context::Debug::GetMemoryRegions(FEX::DebuggerState::GetContext(), &MappedRegions); - } + //if (ImGui::Begin("#Memory Viewer", &ShowMemoryWindow)) { + // if (FEX::DebuggerState::ActiveCore() && !FEX::DebuggerState::IsCoreRunning()) { + // FEXCore::Context::Debug::GetMemoryRegions(FEX::DebuggerState::GetContext(), &MappedRegions); + // } - if (!MappedRegions.empty()) { - ImGui::PushItemWidth(-1.0); - if (ImGui::ListBox("Mapped Regions", &MappedRegionsCurrentItem, MappedRegionGetter, nullptr, MappedRegions.size())) { - } - ImGui::PopItemWidth(); + // if (!MappedRegions.empty()) { + // ImGui::PushItemWidth(-1.0); + // if (ImGui::ListBox("Mapped Regions", &MappedRegionsCurrentItem, MappedRegionGetter, nullptr, MappedRegions.size())) { + // } + // ImGui::PopItemWidth(); - if (ImGui::InputText("RIP:", CurrentAddressString, 32, ImGuiInputTextFlags_EnterReturnsTrue)) { - DisplayAddress(std::stoull(CurrentAddressString, nullptr, 0)); - } + // if (ImGui::InputText("RIP:", CurrentAddressString, 32, ImGuiInputTextFlags_EnterReturnsTrue)) { + // DisplayAddress(std::stoull(CurrentAddressString, nullptr, 0)); + // } - ImGui::DragInt("Size", &CodeSize, 1.0f, 1, 255); - if (ImGui::Button("Disasm")) { - CurrentAddress = std::stoull(CurrentAddressString, nullptr, 0); - Disasm::DisasmGuest(CurrentAddress, CodeSize); - } - if (FEX::DebuggerState::IsCoreRunning()) { - ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); - ImGui::PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * 0.5f); - } - if (ImGui::Button("Compile RIP")) { - FEXCore::Context::Debug::CompileRIP(FEX::DebuggerState::GetContext(), CurrentAddress); + // ImGui::DragInt("Size", &CodeSize, 1.0f, 1, 255); + // if (ImGui::Button("Disasm")) { + // CurrentAddress = std::stoull(CurrentAddressString, nullptr, 0); + // Disasm::DisasmGuest(CurrentAddress, CodeSize); + // } + // if (FEX::DebuggerState::IsCoreRunning()) { + // ImGui::PushItemFlag(ImGuiItemFlags_Disabled, true); + // ImGui::PushStyleVar(ImGuiStyleVar_Alpha, ImGui::GetStyle().Alpha * 0.5f); + // } + // if (ImGui::Button("Compile RIP")) { + // FEXCore::Context::Debug::CompileRIP(FEX::DebuggerState::GetContext(), CurrentAddress); - std::stringstream out; - FEX::DebuggerState::GetIR(&out, CurrentAddress); - Disasm::Disasm(CurrentAddress); - Logging::IRData = out.str(); + // std::stringstream out; + // FEX::DebuggerState::GetIR(&out, CurrentAddress); + // Disasm::Disasm(CurrentAddress); + // Logging::IRData = out.str(); - // FEXCore::IR::IntrusiveIRList *ir; - // bool HadIR = FEXCore::Context::Debug::FindIRForRIP(FEX::DebuggerState::GetContext(), CurrentAddress, &ir); - // if (HadIR) { - // IR::CalculateCFGLines(ir); - // } - } - if (FEX::DebuggerState::IsCoreRunning()) { - ImGui::PopStyleVar(); - ImGui::PopItemFlag(); - } + // // FEXCore::IR::IntrusiveIRList *ir; + // // bool HadIR = FEXCore::Context::Debug::FindIRForRIP(FEX::DebuggerState::GetContext(), CurrentAddress, &ir); + // // if (HadIR) { + // // IR::CalculateCFGLines(ir); + // // } + // } + // if (FEX::DebuggerState::IsCoreRunning()) { + // ImGui::PopStyleVar(); + // ImGui::PopItemFlag(); + // } - if (ImGui::Button("Go to current RIP")) { - if (FEX::DebuggerState::ActiveCore()) { - DisplayAddress(CPUState::CurrentState.rip); - } - } + // if (ImGui::Button("Go to current RIP")) { + // if (FEX::DebuggerState::ActiveCore()) { + // DisplayAddress(CPUState::CurrentState.rip); + // } + // } - if (ImGui::BeginChildFrame(ImGui::GetID("Hex"), ImVec2(-1, -1))) { - ImGui::PushItemWidth(-1.0); + // if (ImGui::BeginChildFrame(ImGui::GetID("Hex"), ImVec2(-1, -1))) { + // ImGui::PushItemWidth(-1.0); - if (FEXImGui::ListBox("##Memory Hex", - &MappedRegionsMemoryCurrentItem, - MappedRegionMemoryGetter, - nullptr, - static_cast(MappedRegions[MappedRegionsCurrentItem].Size) / 16)) { - CurrentAddress = MappedRegions[MappedRegionsCurrentItem].Offset + MappedRegionsMemoryCurrentItem * 16; - std::ostringstream out{}; - out << "0x" << std::hex << CurrentAddress; - strncpy(CurrentAddressString, out.str().c_str(), 32); - } - ImGui::PopItemWidth(); - } - ImGui::EndChildFrame(); - } - - } - ImGui::End(); + // if (FEXImGui::ListBox("##Memory Hex", + // &MappedRegionsMemoryCurrentItem, + // MappedRegionMemoryGetter, + // nullptr, + // static_cast(MappedRegions[MappedRegionsCurrentItem].Size) / 16)) { + // CurrentAddress = MappedRegions[MappedRegionsCurrentItem].Offset + MappedRegionsMemoryCurrentItem * 16; + // std::ostringstream out{}; + // out << "0x" << std::hex << CurrentAddress; + // strncpy(CurrentAddressString, out.str().c_str(), 32); + // } + // ImGui::PopItemWidth(); + // } + // ImGui::EndChildFrame(); + // } + //} + //ImGui::End(); } void Menu() { diff --git a/Source/Tools/Debugger/Main.cpp b/Source/Tools/Debugger/Main.cpp index f7e73af4e..b51fba0ec 100644 --- a/Source/Tools/Debugger/Main.cpp +++ b/Source/Tools/Debugger/Main.cpp @@ -12,7 +12,6 @@ #include #include #include -#include #include #include @@ -26,7 +25,6 @@ Event SteppingEvent; FEXCore::Context::Context *CTX{}; -FEXCore::SHM::SHMObject *SHM{}; std::atomic_bool ShouldClose = false; std::thread CoreThread; @@ -42,11 +40,8 @@ void StepCallback() { } void CreateCoreCallback(char const *Filename, bool ELF) { - SHM = FEXCore::SHM::AllocateSHMRegion(1ULL << 32); CTX = FEXCore::Context::CreateNewContext(); - FEXCore::Context::AddGuestMemoryRegion(CTX, SHM); - FEXCore::Config::SetConfig(CTX, FEXCore::Config::CONFIG_DEFAULTCORE, FEX::DebuggerState::GetCoreType()); FEXCore::Context::InitializeContext(CTX); @@ -84,15 +79,10 @@ void CompileRIPCallback(uint64_t RIP) { void CloseCallback() { FEXCore::Context::Stop(CTX); - if (SHM) { - FEXCore::SHM::DestroyRegion(SHM); - } - if (CTX) { FEXCore::Context::DestroyContext(CTX); } - SHM = nullptr; CTX = nullptr; ShouldClose = false; From f17ec1661ca74d1e00a760c0e25b51ecb8bd88d8 Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Thu, 10 Dec 2020 02:00:13 -0800 Subject: [PATCH 6/7] Removes -U option from POSIX unit test runner Option no longer exists. mlockall POSIX test now works since it doesn't try to make 64GB of memory resident in RAM --- unittests/POSIX/CMakeLists.txt | 8 ++++---- unittests/POSIX/Known_Failures | 1 - 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/unittests/POSIX/CMakeLists.txt b/unittests/POSIX/CMakeLists.txt index 511a1fbd0..7e00e5e83 100644 --- a/unittests/POSIX/CMakeLists.txt +++ b/unittests/POSIX/CMakeLists.txt @@ -2,7 +2,7 @@ # Careful. Globbing can't see changes to the contents of files # Need to do a fresh clean to see changes file(GLOB_RECURSE POSIX_TESTS CONFIGURE_DEPENDS ${CMAKE_SOURCE_DIR}/External/fex-posixtest-bins/conformance/*.test) - + foreach(POSIX_TEST ${POSIX_TESTS}) string(REPLACE "/fex-posixtest-bins/" ";" TEST_NAME_LIST ${POSIX_TEST}) @@ -16,9 +16,9 @@ foreach(POSIX_TEST ${POSIX_TESTS}) "${CMAKE_SOURCE_DIR}/unittests/POSIX/Disabled_Tests" "${TEST_NAME}" "${CMAKE_BINARY_DIR}/Bin/FEXLoader" - "-U" "-c" "irint" "-n" "500" "-R" $ENV{ROOTFS} "--" + "-c" "irint" "-n" "500" "-R" $ENV{ROOTFS} "--" "${POSIX_TEST}") - + add_test(NAME "${TEST_NAME}.jit.posix" COMMAND "python3" "${CMAKE_SOURCE_DIR}/Scripts/posix_test_runner.py" "${CMAKE_SOURCE_DIR}/unittests/POSIX/Known_Failures" @@ -26,7 +26,7 @@ foreach(POSIX_TEST ${POSIX_TESTS}) "${CMAKE_SOURCE_DIR}/unittests/POSIX/Disabled_Tests" "${TEST_NAME}" "${CMAKE_BINARY_DIR}/Bin/FEXLoader" - "-U" "-c" "irjit" "-n" "500" "-R" $ENV{ROOTFS} "--" + "-c" "irjit" "-n" "500" "-R" $ENV{ROOTFS} "--" "${POSIX_TEST}") diff --git a/unittests/POSIX/Known_Failures b/unittests/POSIX/Known_Failures index 120a41bb3..ab799eb44 100644 --- a/unittests/POSIX/Known_Failures +++ b/unittests/POSIX/Known_Failures @@ -2,7 +2,6 @@ conformance-interfaces-clock-1-1.test conformance-interfaces-clock_getcpuclockid-2-1.test conformance-interfaces-clock_nanosleep-11-1.test conformance-interfaces-clock_nanosleep-13-1.test -conformance-interfaces-mlockall-8-1.test conformance-interfaces-munmap-2-1.test conformance-interfaces-nanosleep-10000-1.test conformance-interfaces-nanosleep-5-1.test From 17c34537f92d5f549353b23942c5d0e1d147bc7a Mon Sep 17 00:00:00 2001 From: Ryan Houdek Date: Thu, 10 Dec 2020 02:15:52 -0800 Subject: [PATCH 7/7] Redisable the mlockall unit test CI runners don't have enough RAM to ensure it consistently passes, so it is flakey --- unittests/POSIX/Disabled_Tests | 3 +++ 1 file changed, 3 insertions(+) diff --git a/unittests/POSIX/Disabled_Tests b/unittests/POSIX/Disabled_Tests index 30425f7b0..4ed0341e2 100644 --- a/unittests/POSIX/Disabled_Tests +++ b/unittests/POSIX/Disabled_Tests @@ -559,6 +559,9 @@ conformance-interfaces-nanosleep-7-1.test # uses sigabort conformance-interfaces-nanosleep-7-2.test # uses sigabort conformance-interfaces-sigprocmask-6-1.test +# unstable because of threaded unit test running +conformance-interfaces-mlockall-8-1.test + # Race happy conformance-interfaces-nanosleep-1-3.test conformance-interfaces-clock_nanosleep-1-3.test