summaryrefslogtreecommitdiff
path: root/src/common/host_memory.cpp
diff options
context:
space:
mode:
authorZephyron <zephyron@citron-emu.org>2025-02-01 21:50:33 +1000
committerZephyron <zephyron@citron-emu.org>2025-02-01 21:50:33 +1000
commitf4b9e54b2280eea66fe449416251d6c50ce0d3a8 (patch)
tree7ebe3e8a57efada717ac6bce4fe7f99628dfc313 /src/common/host_memory.cpp
parent70a9f20ae11aee144bae229a81418cfaadf354f7 (diff)
common/nvdrv: improve memory validation and error handling
Implements several improvements to memory handling and validation: - host_memory: Add IsValidMapping() and IsDirectMappingEnabled() methods to validate memory access - host_memory: Fix virtual base offset calculation to use proper pointer arithmetic - host_memory: Add size field to track allocation size - nvhost_ctrl_gpu: Return InvalidState instead of InvalidValue for TPC mask buffer size validation - Update copyright year for citron The changes improve memory safety by adding explicit validation checks and fixing pointer arithmetic in the virtual memory implementation.
Diffstat (limited to 'src/common/host_memory.cpp')
-rw-r--r--src/common/host_memory.cpp29
1 files changed, 28 insertions, 1 deletions
diff --git a/src/common/host_memory.cpp b/src/common/host_memory.cpp
index 4f5a11f86..4ae22fcfb 100644
--- a/src/common/host_memory.cpp
+++ b/src/common/host_memory.cpp
@@ -200,11 +200,20 @@ public:
UNREACHABLE();
}
+ bool IsValidMapping(size_t offset, size_t size) const {
+ return (offset + size) <= backing_size;
+ }
+
+ bool IsDirectMappingEnabled() const {
+ return direct_mapping_enabled;
+ }
+
const size_t backing_size; ///< Size of the backing memory in bytes
const size_t virtual_size; ///< Size of the virtual address placeholder in bytes
u8* backing_base{};
u8* virtual_base{};
+ bool direct_mapping_enabled{false};
private:
/// Release all resources in the object
@@ -602,6 +611,14 @@ public:
virtual_base = nullptr;
}
+ bool IsValidMapping(size_t offset, size_t size) const {
+ return (offset + size) <= backing_size;
+ }
+
+ bool IsDirectMappingEnabled() const {
+ return virtual_base == nullptr;
+ }
+
const size_t backing_size; ///< Size of the backing memory in bytes
const size_t virtual_size; ///< Size of the virtual address placeholder in bytes
@@ -675,6 +692,14 @@ public:
void EnableDirectMappedAddress() {}
+ bool IsValidMapping(size_t offset, size_t size) const {
+ return false;
+ }
+
+ bool IsDirectMappingEnabled() const {
+ return false;
+ }
+
u8* backing_base{nullptr};
u8* virtual_base{nullptr};
};
@@ -696,7 +721,9 @@ HostMemory::HostMemory(size_t backing_size_, size_t virtual_size_)
// Ensure the virtual base is aligned to the L2 block size.
virtual_base = reinterpret_cast<u8*>(
Common::AlignUp(reinterpret_cast<uintptr_t>(virtual_base), HugePageSize));
- virtual_base_offset = virtual_base - impl->virtual_base;
+ virtual_base_offset = static_cast<size_t>(
+ reinterpret_cast<uintptr_t>(virtual_base) -
+ reinterpret_cast<uintptr_t>(impl->virtual_base));
}
} catch (const std::bad_alloc&) {