From f4b9e54b2280eea66fe449416251d6c50ce0d3a8 Mon Sep 17 00:00:00 2001 From: Zephyron Date: Sat, 1 Feb 2025 21:50:33 +1000 Subject: 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. --- src/common/host_memory.cpp | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) (limited to 'src/common/host_memory.cpp') 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( Common::AlignUp(reinterpret_cast(virtual_base), HugePageSize)); - virtual_base_offset = virtual_base - impl->virtual_base; + virtual_base_offset = static_cast( + reinterpret_cast(virtual_base) - + reinterpret_cast(impl->virtual_base)); } } catch (const std::bad_alloc&) { -- cgit v1.2.3