summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitmodules6
m---------externals/SPIRV-Headers0
m---------externals/SPIRV-Tools0
m---------externals/Vulkan-Headers0
m---------externals/Vulkan-Utility-Libraries0
m---------externals/VulkanMemoryAllocator0
m---------externals/vcpkg0
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp7
-rw-r--r--src/core/memory.cpp16
-rw-r--r--vcpkg.json2
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",