diff options
-rw-r--r-- | .gitmodules | 6 | ||||
m--------- | externals/SPIRV-Headers | 0 | ||||
m--------- | externals/SPIRV-Tools | 0 | ||||
m--------- | externals/Vulkan-Headers | 0 | ||||
m--------- | externals/Vulkan-Utility-Libraries | 0 | ||||
m--------- | externals/VulkanMemoryAllocator | 0 | ||||
m--------- | externals/vcpkg | 0 | ||||
-rw-r--r-- | src/core/arm/dynarmic/arm_dynarmic_32.cpp | 7 | ||||
-rw-r--r-- | src/core/memory.cpp | 16 | ||||
-rw-r--r-- | vcpkg.json | 2 |
10 files changed, 30 insertions, 1 deletions
diff --git a/.gitmodules b/.gitmodules index 0d8210906..8f1cc4342 100644 --- a/.gitmodules +++ b/.gitmodules @@ -67,3 +67,9 @@ [submodule "Vulkan-Utility-Libraries"] path = externals/Vulkan-Utility-Libraries url = https://github.com/KhronosGroup/Vulkan-Utility-Libraries.git +[submodule "externals/SPIRV-Tools"] + path = externals/SPIRV-Tools + url = https://github.com/KhronosGroup/SPIRV-Tools.git +[submodule "externals/SPIRV-Headers"] + path = externals/SPIRV-Headers + url = https://github.com/KhronosGroup/SPIRV-Headers.git diff --git a/externals/SPIRV-Headers b/externals/SPIRV-Headers new file mode 160000 +Subproject 2b2e05e088841c63c0b6fd4c9fb380d8688738d diff --git a/externals/SPIRV-Tools b/externals/SPIRV-Tools new file mode 160000 +Subproject b9d5ced92ac454caf526c3b80d5105a1f38878c diff --git a/externals/Vulkan-Headers b/externals/Vulkan-Headers -Subproject d4a196d8c84e032d27f999adcea3075517c1c97 +Subproject a03d2f6d5753b365d704d58161825890baad075 diff --git a/externals/Vulkan-Utility-Libraries b/externals/Vulkan-Utility-Libraries -Subproject 5a88b6042edb8f03eefc8de73bd73a899989373 +Subproject 7b23ba7a5f86936a8d783baf64a77c38977d689 diff --git a/externals/VulkanMemoryAllocator b/externals/VulkanMemoryAllocator -Subproject f74c2d906f1537114fe0c0d855d5d27db91898c +Subproject 7ab8483d10b665ba8d478e1502380c40e2374ac diff --git a/externals/vcpkg b/externals/vcpkg -Subproject d4f3e122069912636c123b7ece673f6e01513ce +Subproject cf035d9916a0a23042b41fcae7ee0386d245af0 diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 36478f722..28d062e7a 100644 --- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp +++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp @@ -95,6 +95,13 @@ public: LOG_CRITICAL(Core_ARM, "Cannot execute instruction at unmapped address {:#08x}", pc); ReturnException(pc, PrefetchAbort); return; + case Dynarmic::A32::Exception::AccessViolation: + if (pc == 0 || pc < 0x1000) { + LOG_CRITICAL(Core_ARM, "Null pointer dereference at {:#08x}", pc); + ReturnException(pc, DataAbort); + return; + } + [[fallthrough]]; default: if (m_debugger_enabled) { ReturnException(pc, InstructionBreakpoint); diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 62437415b..4e9c58718 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -737,12 +737,21 @@ struct Memory::Impl { const u8* const ptr = GetPointerImpl( GetInteger(vaddr), [vaddr]() { + // Add special handling for null pointer reads + if (GetInteger(vaddr) == 0 || GetInteger(vaddr) < 0x1000) { + LOG_ERROR(HW_Memory, "Null pointer Read{} @ 0x{:016X}", sizeof(T) * 8, + GetInteger(vaddr)); + return; + } LOG_ERROR(HW_Memory, "Unmapped Read{} @ 0x{:016X}", sizeof(T) * 8, GetInteger(vaddr)); }, [&]() { HandleRasterizerDownload(GetInteger(vaddr), sizeof(T)); }); if (ptr) { std::memcpy(&result, ptr, sizeof(T)); + } else if (GetInteger(vaddr) == 0) { + // Return 0 for null pointer reads instead of random memory + result = 0; } return result; } @@ -761,6 +770,12 @@ struct Memory::Impl { u8* const ptr = GetPointerImpl( GetInteger(vaddr), [vaddr, data]() { + // Add special handling for null pointer writes + if (GetInteger(vaddr) == 0 || GetInteger(vaddr) < 0x1000) { + LOG_ERROR(HW_Memory, "Null pointer Write{} @ 0x{:016X} = 0x{:016X}", sizeof(T) * 8, + GetInteger(vaddr), static_cast<u64>(data)); + return; + } LOG_ERROR(HW_Memory, "Unmapped Write{} @ 0x{:016X} = 0x{:016X}", sizeof(T) * 8, GetInteger(vaddr), static_cast<u64>(data)); }, @@ -768,6 +783,7 @@ struct Memory::Impl { if (ptr) { std::memcpy(ptr, &data, sizeof(T)); } + // Silently ignore writes to null pointer } template <typename T> diff --git a/vcpkg.json b/vcpkg.json index 180232afd..4c10341e9 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -1,7 +1,7 @@ { "$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json", "name": "citron", - "builtin-baseline": "7adc2e4d49e8d0efc07a369079faa6bc3dbb90f3", + "builtin-baseline": "a42af01b72c28a8e1d7b48107b33e4f286a55ef6", "version": "1.0", "dependencies": [ "boost-algorithm", |