From b0b1d5a93fe550b3dcdd2962de75686fb5667ba7 Mon Sep 17 00:00:00 2001 From: SDK Chan Date: Fri, 1 Aug 2025 19:17:59 +0000 Subject: [PATCH 1/2] [core/nvdrv] Fix Random Unmap Memory Clearing --- .../service/nvdrv/devices/nvhost_as_gpu.cpp | 21 +++++++++++-------- .../hle/service/nvdrv/devices/nvhost_as_gpu.h | 6 ++++++ 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp index 68fe388741..7b370f68b7 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2021 yuzu Emulator Project // SPDX-FileCopyrightText: 2021 Skyline Team and Contributors // SPDX-License-Identifier: GPL-3.0-or-later @@ -406,19 +409,21 @@ NvResult nvhost_as_gpu::MapBufferEx(IoctlMapBufferEx& params) { mapping_map[params.offset] = mapping; } + map_buffer_offsets.insert(params.offset); + return NvResult::Success; } NvResult nvhost_as_gpu::UnmapBuffer(IoctlUnmapBuffer& params) { - LOG_DEBUG(Service_NVDRV, "called, offset=0x{:X}", params.offset); + if (map_buffer_offsets.find(params.offset) != map_buffer_offsets.end()) { + LOG_DEBUG(Service_NVDRV, "called, offset=0x{:X}", params.offset); - std::scoped_lock lock(mutex); + std::scoped_lock lock(mutex); - if (!vm.initialised) { - return NvResult::BadValue; - } + if (!vm.initialised) { + return NvResult::BadValue; + } - try { auto mapping{mapping_map.at(params.offset)}; if (!mapping->fixed) { @@ -440,10 +445,8 @@ NvResult nvhost_as_gpu::UnmapBuffer(IoctlUnmapBuffer& params) { nvmap.UnpinHandle(mapping->handle); mapping_map.erase(params.offset); - } catch (const std::out_of_range&) { - LOG_WARNING(Service_NVDRV, "Couldn't find region to unmap at 0x{:X}", params.offset); + map_buffer_offsets.erase(params.offset); } - return NvResult::Success; } diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h index 7d0a999888..cad6457293 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project +// SPDX-License-Identifier: GPL-3.0-or-later + // SPDX-FileCopyrightText: 2021 yuzu Emulator Project // SPDX-FileCopyrightText: 2021 Skyline Team and Contributors // SPDX-License-Identifier: GPL-3.0-or-later @@ -10,6 +13,7 @@ #include #include #include +#include #include #include "common/address_space.h" @@ -109,6 +113,8 @@ private: }; static_assert(sizeof(IoctlRemapEntry) == 20, "IoctlRemapEntry is incorrect size"); + std::unordered_set map_buffer_offsets{}; + struct IoctlMapBufferEx { MappingFlags flags{}; // bit0: fixed_offset, bit2: cacheable u32_le kind{}; // -1 is default -- 2.39.5 From c087ac45f6cdc1eb36e1e39700e848c4b8ef731e Mon Sep 17 00:00:00 2001 From: SDK-Chan Date: Fri, 1 Aug 2025 19:25:07 +0200 Subject: [PATCH 2/2] Update src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp --- src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp index 7b370f68b7..029a9d9cd5 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp @@ -315,7 +315,7 @@ NvResult nvhost_as_gpu::Remap(std::span entries) { NvResult nvhost_as_gpu::MapBufferEx(IoctlMapBufferEx& params) { LOG_DEBUG(Service_NVDRV, "called, flags={:X}, nvmap_handle={:X}, buffer_offset={}, mapping_size={}" - ", offset={}", + ", offset=0x{:X}", params.flags, params.handle, params.buffer_offset, params.mapping_size, params.offset); -- 2.39.5