From 5b3bc0e97a64e37564febd033a0f367a7799bcaf Mon Sep 17 00:00:00 2001 From: DH Date: Fri, 5 Dec 2025 20:44:56 +0300 Subject: [PATCH] enforce gnm driver loading, fix syncing flexible memory with gpu --- kernel/orbis/src/vmem.cpp | 23 +++++++++++++++++------ rpcsx/ops.cpp | 2 +- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/kernel/orbis/src/vmem.cpp b/kernel/orbis/src/vmem.cpp index 1fabe6f3a..105b0c973 100644 --- a/kernel/orbis/src/vmem.cpp +++ b/kernel/orbis/src/vmem.cpp @@ -261,8 +261,10 @@ static void release(orbis::Process *process, decltype(g_vmInstance)::type *vmem, auto blockRange = range.intersection(it.range()); + auto gpuProt = orbis::vmem::toGpuProtection(it->prot); if (it->flags & orbis::vmem::BlockFlags::FlexibleMemory) { - if (it->device == nullptr) { + if (it->device == nullptr && gpuProt) { + amdgpu::unmapMemory(process->pid, blockRange); orbis::fmem::deallocate(blockRange); } budget->release(orbis::BudgetResource::Fmem, blockRange.size()); @@ -281,9 +283,8 @@ static void release(orbis::Process *process, decltype(g_vmInstance)::type *vmem, } } - if (orbis::vmem::toGpuProtection(it->prot) && - (it->flags & orbis::vmem::BlockFlags::DirectMemory | - orbis::vmem::BlockFlags::PooledMemory)) { + if (gpuProt && (it->flags & orbis::vmem::BlockFlags::DirectMemory | + orbis::vmem::BlockFlags::PooledMemory)) { amdgpu::unmapMemory(process->pid, blockRange); } } @@ -566,7 +567,8 @@ std::pair orbis::vmem::mapFile( blockpool::releaseControlBlock(); } - rx::println(stderr, "map: device allocation failure, blockFlags {}", blockFlags); + rx::println(stderr, "map: device allocation failure, blockFlags {}", + blockFlags); return {{}, error}; } @@ -823,7 +825,13 @@ std::pair orbis::vmem::mapFlex( AllocationFlags::Fixed | (allocFlags & AllocationFlags::NoMerge), alignment); - // vmemDump(process, rx::format("mapFlex {:x}-{:x}", vmemRange.beginAddress(), + if (prot) { + amdgpu::mapMemory(process->pid, vmemRange, MemoryType::WbOnion, prot, + allocationInfo.deviceOffset); + } + + // vmemDump(process, rx::format("mapFlex {:x}-{:x}", + // vmemRange.beginAddress(), // vmemRange.endAddress())); fmemResource.commit(); return {vmemRange, {}}; @@ -1139,6 +1147,9 @@ orbis::ErrorCode orbis::vmem::protect(Process *process, rx::AddressRange range, toCpuProtection(blockProt)); rx::dieIf(errc != ErrorCode{}, "failed to map flexible memory"); + + amdgpu::mapMemory(process->pid, range, MemoryType::WbOnion, + prot, pmemRange.beginAddress()); } else if (!blockProt && alloc.prot) { auto errc = fmem::deallocate(rx::AddressRange::fromBeginSize( alloc.deviceOffset, range.size())); diff --git a/rpcsx/ops.cpp b/rpcsx/ops.cpp index 886a24da5..79b88aac8 100644 --- a/rpcsx/ops.cpp +++ b/rpcsx/ops.cpp @@ -357,7 +357,7 @@ orbis::SysResult dynlib_load_prx(orbis::Thread *thread, } if (it->second == resultModule) { - wasNeeded = true; + // wasNeeded = true; } continue; }