mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-07-27 04:25:12 +00:00
Fix sceKernelSetVirtualRangeName
Partially addresses a "regression" introduced when I fixed up some asserts. As noted in the code, this implementation is still slightly inaccurate, as handling this properly could cause regressions on Windows.
This commit is contained in:
parent
d9cc4f2d99
commit
6752cd039d
@ -389,7 +389,7 @@ s32 PS4_SYSV_ABI sceKernelBatchMap2(OrbisKernelBatchMapEntry* entries, int numEn
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
s32 PS4_SYSV_ABI sceKernelSetVirtualRangeName(const void* addr, size_t len, const char* name) {
|
s32 PS4_SYSV_ABI sceKernelSetVirtualRangeName(const void* addr, u64 len, const char* name) {
|
||||||
if (name == nullptr) {
|
if (name == nullptr) {
|
||||||
LOG_ERROR(Kernel_Vmm, "name is invalid!");
|
LOG_ERROR(Kernel_Vmm, "name is invalid!");
|
||||||
return ORBIS_KERNEL_ERROR_EFAULT;
|
return ORBIS_KERNEL_ERROR_EFAULT;
|
||||||
|
@ -165,7 +165,7 @@ s32 PS4_SYSV_ABI sceKernelBatchMap(OrbisKernelBatchMapEntry* entries, int numEnt
|
|||||||
s32 PS4_SYSV_ABI sceKernelBatchMap2(OrbisKernelBatchMapEntry* entries, int numEntries,
|
s32 PS4_SYSV_ABI sceKernelBatchMap2(OrbisKernelBatchMapEntry* entries, int numEntries,
|
||||||
int* numEntriesOut, int flags);
|
int* numEntriesOut, int flags);
|
||||||
|
|
||||||
s32 PS4_SYSV_ABI sceKernelSetVirtualRangeName(const void* addr, size_t len, const char* name);
|
s32 PS4_SYSV_ABI sceKernelSetVirtualRangeName(const void* addr, u64 len, const char* name);
|
||||||
|
|
||||||
s32 PS4_SYSV_ABI sceKernelMemoryPoolExpand(u64 searchStart, u64 searchEnd, u64 len, u64 alignment,
|
s32 PS4_SYSV_ABI sceKernelMemoryPoolExpand(u64 searchStart, u64 searchEnd, u64 len, u64 alignment,
|
||||||
u64* physAddrOut);
|
u64* physAddrOut);
|
||||||
|
@ -769,12 +769,31 @@ s32 MemoryManager::SetDirectMemoryType(s64 phys_addr, s32 memory_type) {
|
|||||||
return ORBIS_OK;
|
return ORBIS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MemoryManager::NameVirtualRange(VAddr virtual_addr, size_t size, std::string_view name) {
|
void MemoryManager::NameVirtualRange(VAddr virtual_addr, u64 size, std::string_view name) {
|
||||||
auto it = FindVMA(virtual_addr);
|
// Sizes are aligned up to the nearest 16_KB
|
||||||
|
auto aligned_size = Common::AlignUp(size, 16_KB);
|
||||||
|
// Addresses are aligned down to the nearest 16_KB
|
||||||
|
auto aligned_addr = Common::AlignDown(virtual_addr, 16_KB);
|
||||||
|
|
||||||
ASSERT_MSG(it->second.Contains(virtual_addr, size),
|
auto it = FindVMA(aligned_addr);
|
||||||
"Range provided is not fully contained in vma");
|
s64 remaining_size = aligned_size;
|
||||||
it->second.name = name;
|
auto current_addr = aligned_addr;
|
||||||
|
while (remaining_size > 0) {
|
||||||
|
// Nothing needs to be done to free VMAs
|
||||||
|
if (!it->second.IsFree()) {
|
||||||
|
if (remaining_size < it->second.size) {
|
||||||
|
// We should split VMAs here, but this could cause trouble for Windows.
|
||||||
|
// Instead log a warning and name the whole VMA.
|
||||||
|
// it = CarveVMA(current_addr, remaining_size);
|
||||||
|
LOG_WARNING(Kernel_Vmm, "Trying to partially name a range");
|
||||||
|
}
|
||||||
|
auto& vma = it->second;
|
||||||
|
vma.name = name;
|
||||||
|
}
|
||||||
|
remaining_size -= it->second.size;
|
||||||
|
current_addr += it->second.size;
|
||||||
|
it = FindVMA(current_addr);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void MemoryManager::InvalidateMemory(const VAddr addr, const u64 size) const {
|
void MemoryManager::InvalidateMemory(const VAddr addr, const u64 size) const {
|
||||||
|
@ -215,7 +215,7 @@ public:
|
|||||||
|
|
||||||
s32 SetDirectMemoryType(s64 phys_addr, s32 memory_type);
|
s32 SetDirectMemoryType(s64 phys_addr, s32 memory_type);
|
||||||
|
|
||||||
void NameVirtualRange(VAddr virtual_addr, size_t size, std::string_view name);
|
void NameVirtualRange(VAddr virtual_addr, u64 size, std::string_view name);
|
||||||
|
|
||||||
void InvalidateMemory(VAddr addr, u64 size) const;
|
void InvalidateMemory(VAddr addr, u64 size) const;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user