mirror of
https://git.citron-emu.org/Citron/Citron.git
synced 2025-01-22 08:36:32 +01:00
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.
This commit is contained in:
parent
07b949025f
commit
b938893599
10 changed files with 36 additions and 5 deletions
6
.gitmodules
vendored
6
.gitmodules
vendored
|
@ -67,3 +67,9 @@
|
||||||
[submodule "Vulkan-Utility-Libraries"]
|
[submodule "Vulkan-Utility-Libraries"]
|
||||||
path = externals/Vulkan-Utility-Libraries
|
path = externals/Vulkan-Utility-Libraries
|
||||||
url = https://github.com/KhronosGroup/Vulkan-Utility-Libraries.git
|
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
|
||||||
|
|
1
externals/SPIRV-Headers
vendored
Submodule
1
externals/SPIRV-Headers
vendored
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit 2b2e05e088841c63c0b6fd4c9fb380d8688738d3
|
1
externals/SPIRV-Tools
vendored
Submodule
1
externals/SPIRV-Tools
vendored
Submodule
|
@ -0,0 +1 @@
|
||||||
|
Subproject commit b9d5ced92ac454caf526c3b80d5105a1f38878ce
|
2
externals/Vulkan-Headers
vendored
2
externals/Vulkan-Headers
vendored
|
@ -1 +1 @@
|
||||||
Subproject commit d4a196d8c84e032d27f999adcea3075517c1c97f
|
Subproject commit a03d2f6d5753b365d704d58161825890baad0755
|
2
externals/Vulkan-Utility-Libraries
vendored
2
externals/Vulkan-Utility-Libraries
vendored
|
@ -1 +1 @@
|
||||||
Subproject commit 5a88b6042edb8f03eefc8de73bd73a899989373f
|
Subproject commit 7b23ba7a5f86936a8d783baf64a77c38977d6890
|
2
externals/VulkanMemoryAllocator
vendored
2
externals/VulkanMemoryAllocator
vendored
|
@ -1 +1 @@
|
||||||
Subproject commit f74c2d906f1537114fe0c0d855d5d27db91898cb
|
Subproject commit 7ab8483d10b665ba8d478e1502380c40e2374ac7
|
2
externals/vcpkg
vendored
2
externals/vcpkg
vendored
|
@ -1 +1 @@
|
||||||
Subproject commit d4f3e122069912636c123b7ece673f6e01513cea
|
Subproject commit cf035d9916a0a23042b41fcae7ee0386d245af08
|
|
@ -95,6 +95,13 @@ public:
|
||||||
LOG_CRITICAL(Core_ARM, "Cannot execute instruction at unmapped address {:#08x}", pc);
|
LOG_CRITICAL(Core_ARM, "Cannot execute instruction at unmapped address {:#08x}", pc);
|
||||||
ReturnException(pc, PrefetchAbort);
|
ReturnException(pc, PrefetchAbort);
|
||||||
return;
|
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:
|
default:
|
||||||
if (m_debugger_enabled) {
|
if (m_debugger_enabled) {
|
||||||
ReturnException(pc, InstructionBreakpoint);
|
ReturnException(pc, InstructionBreakpoint);
|
||||||
|
|
|
@ -737,12 +737,21 @@ struct Memory::Impl {
|
||||||
const u8* const ptr = GetPointerImpl(
|
const u8* const ptr = GetPointerImpl(
|
||||||
GetInteger(vaddr),
|
GetInteger(vaddr),
|
||||||
[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,
|
LOG_ERROR(HW_Memory, "Unmapped Read{} @ 0x{:016X}", sizeof(T) * 8,
|
||||||
GetInteger(vaddr));
|
GetInteger(vaddr));
|
||||||
},
|
},
|
||||||
[&]() { HandleRasterizerDownload(GetInteger(vaddr), sizeof(T)); });
|
[&]() { HandleRasterizerDownload(GetInteger(vaddr), sizeof(T)); });
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
std::memcpy(&result, ptr, sizeof(T));
|
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;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -761,6 +770,12 @@ struct Memory::Impl {
|
||||||
u8* const ptr = GetPointerImpl(
|
u8* const ptr = GetPointerImpl(
|
||||||
GetInteger(vaddr),
|
GetInteger(vaddr),
|
||||||
[vaddr, data]() {
|
[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,
|
LOG_ERROR(HW_Memory, "Unmapped Write{} @ 0x{:016X} = 0x{:016X}", sizeof(T) * 8,
|
||||||
GetInteger(vaddr), static_cast<u64>(data));
|
GetInteger(vaddr), static_cast<u64>(data));
|
||||||
},
|
},
|
||||||
|
@ -768,6 +783,7 @@ struct Memory::Impl {
|
||||||
if (ptr) {
|
if (ptr) {
|
||||||
std::memcpy(ptr, &data, sizeof(T));
|
std::memcpy(ptr, &data, sizeof(T));
|
||||||
}
|
}
|
||||||
|
// Silently ignore writes to null pointer
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json",
|
"$schema": "https://raw.githubusercontent.com/microsoft/vcpkg-tool/main/docs/vcpkg.schema.json",
|
||||||
"name": "citron",
|
"name": "citron",
|
||||||
"builtin-baseline": "7adc2e4d49e8d0efc07a369079faa6bc3dbb90f3",
|
"builtin-baseline": "a42af01b72c28a8e1d7b48107b33e4f286a55ef6",
|
||||||
"version": "1.0",
|
"version": "1.0",
|
||||||
"dependencies": [
|
"dependencies": [
|
||||||
"boost-algorithm",
|
"boost-algorithm",
|
||||||
|
|
Loading…
Reference in a new issue