diff options
| author | Zephyron <zephyron@citron-emu.org> | 2025-01-18 15:19:45 +1000 |
|---|---|---|
| committer | Mike Lothian <mike@fireburn.co.uk> | 2025-05-11 12:17:03 +0100 |
| commit | 221efc229415f6fa3ccc08fddc163b00a26e610c (patch) | |
| tree | 1fa3c4c6c3464e5dbc67637fe49f08dcabbeb764 | |
| parent | 07a40fef9c4897ace0f0ed0454e631ae0b561df5 (diff) | |
memory: Improve null pointer and unmapped memory handling
- Update vcpkg baseline to a42af01b72c28a8e1d7b48107b33e4f286a55ef6
- Add SPIRV-Tools and SPIRV-Headers as submodules
- Update Vulkan-related submodules to latest stable versions
- Improve memory access error handling:
- Add specific handling for null pointer accesses in ARM32 emulation
- Return 0 for null pointer reads instead of undefined behavior
- Silently ignore writes to null pointers
- Add more detailed error messages distinguishing between null pointer
access and other unmapped memory errors
- Treat addresses below 0x1000 as potential null pointer accesses
These changes should provide more graceful handling of null pointer
accesses and improve stability when running games that attempt invalid
memory operations.
| m--------- | externals/Vulkan-Headers | 0 | ||||
| m--------- | externals/Vulkan-Utility-Libraries | 0 | ||||
| m--------- | externals/VulkanMemoryAllocator | 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 |
6 files changed, 24 insertions, 1 deletions
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/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp index 65c4ace38..5dc46d777 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 6f7703fce..47ec8e77b 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 45e5f046b..1f3948085 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": "yuzu", - "builtin-baseline": "7adc2e4d49e8d0efc07a369079faa6bc3dbb90f3", + "builtin-baseline": "a42af01b72c28a8e1d7b48107b33e4f286a55ef6", "version": "1.0", "dependencies": [ "boost-algorithm", |
