From 816288962b8622f54fd9d97375a2a9057b6f8da4 Mon Sep 17 00:00:00 2001 From: Stephen Miller Date: Mon, 2 Sep 2024 09:28:35 -0500 Subject: [PATCH 1/6] Assign is_stack and is_pooled Properly set these values to avoid potential errors, and future proof for when these types of memory are emulated. --- src/core/memory.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 7896ae500..de0abb8a6 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -311,6 +311,8 @@ int MemoryManager::VirtualQuery(VAddr addr, int flags, info->protection = static_cast(vma.prot); info->is_flexible.Assign(vma.type == VMAType::Flexible); info->is_direct.Assign(vma.type == VMAType::Direct); + info->is_stack.Assign(vma.type == VMAType::Stack); + info->is_pooled.Assign(vma.type == VMAType::Pooled); info->is_commited.Assign(vma.type != VMAType::Free && vma.type != VMAType::Reserved); vma.name.copy(info->name.data(), std::min(info->name.size(), vma.name.size())); if (vma.type == VMAType::Direct) { From f8d71b59d9009b79f153516889959a1ff9b1595e Mon Sep 17 00:00:00 2001 From: Stephen Miller Date: Mon, 2 Sep 2024 09:30:32 -0500 Subject: [PATCH 2/6] Fix MemoryManager::VirtualQuery header The headers for these functions were technically not the same as the actual function definition. This didn't cause any emulation issues, but caused some weird issues with my IDE. --- src/core/memory.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/memory.h b/src/core/memory.h index b7edee33a..ea122c512 100644 --- a/src/core/memory.h +++ b/src/core/memory.h @@ -163,9 +163,9 @@ public: int QueryProtection(VAddr addr, void** start, void** end, u32* prot); - int VirtualQuery(VAddr addr, int flags, Libraries::Kernel::OrbisVirtualQueryInfo* info); + int VirtualQuery(VAddr addr, int flags, ::Libraries::Kernel::OrbisVirtualQueryInfo* info); - int DirectMemoryQuery(PAddr addr, bool find_next, Libraries::Kernel::OrbisQueryInfo* out_info); + int DirectMemoryQuery(PAddr addr, bool find_next, ::Libraries::Kernel::OrbisQueryInfo* out_info); int DirectQueryAvailable(PAddr search_start, PAddr search_end, size_t alignment, PAddr* phys_addr_out, size_t* size_out); From 0503054b409774a55ec10731eb8efce3c023bc99 Mon Sep 17 00:00:00 2001 From: Stephen Miller Date: Mon, 2 Sep 2024 09:39:46 -0500 Subject: [PATCH 3/6] Grammar --- src/core/libraries/kernel/memory_management.h | 2 +- src/core/memory.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/core/libraries/kernel/memory_management.h b/src/core/libraries/kernel/memory_management.h index 9a447fe8b..761cb0844 100644 --- a/src/core/libraries/kernel/memory_management.h +++ b/src/core/libraries/kernel/memory_management.h @@ -56,7 +56,7 @@ struct OrbisVirtualQueryInfo { BitField<1, 1, u32> is_direct; BitField<2, 1, u32> is_stack; BitField<3, 1, u32> is_pooled; - BitField<4, 1, u32> is_commited; + BitField<4, 1, u32> is_committed; }; std::array name; }; diff --git a/src/core/memory.cpp b/src/core/memory.cpp index de0abb8a6..7a53c8341 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -313,7 +313,7 @@ int MemoryManager::VirtualQuery(VAddr addr, int flags, info->is_direct.Assign(vma.type == VMAType::Direct); info->is_stack.Assign(vma.type == VMAType::Stack); info->is_pooled.Assign(vma.type == VMAType::Pooled); - info->is_commited.Assign(vma.type != VMAType::Free && vma.type != VMAType::Reserved); + info->is_committed.Assign(vma.type != VMAType::Free && vma.type != VMAType::Reserved); vma.name.copy(info->name.data(), std::min(info->name.size(), vma.name.size())); if (vma.type == VMAType::Direct) { const auto dmem_it = FindDmemArea(vma.phys_base); From dc1313ea3cde87a069ba95ad89acbb20b5c4617c Mon Sep 17 00:00:00 2001 From: Stephen Miller Date: Mon, 2 Sep 2024 09:43:27 -0500 Subject: [PATCH 4/6] Always assign memory_type and offset The memory_type default is based on fpPS4 behavior. I'm not entirely sure how the offset should be handled, but since the value we use defaults to 0 anyway, that should be better than leaving random data in that area. --- src/core/memory.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/core/memory.cpp b/src/core/memory.cpp index 7a53c8341..640751477 100644 --- a/src/core/memory.cpp +++ b/src/core/memory.cpp @@ -308,6 +308,7 @@ int MemoryManager::VirtualQuery(VAddr addr, int flags, const auto& vma = it->second; info->start = vma.base; info->end = vma.base + vma.size; + info->offset = vma.phys_base; info->protection = static_cast(vma.prot); info->is_flexible.Assign(vma.type == VMAType::Flexible); info->is_direct.Assign(vma.type == VMAType::Direct); @@ -318,8 +319,9 @@ int MemoryManager::VirtualQuery(VAddr addr, int flags, if (vma.type == VMAType::Direct) { const auto dmem_it = FindDmemArea(vma.phys_base); ASSERT(dmem_it != dmem_map.end()); - info->offset = vma.phys_base; info->memory_type = dmem_it->second.memory_type; + } else { + info->memory_type = ::Libraries::Kernel::SCE_KERNEL_WB_ONION; } return ORBIS_OK; From 9a772aa2f50e98b9650b805829b001644ea62496 Mon Sep 17 00:00:00 2001 From: Stephen Miller Date: Mon, 2 Sep 2024 10:03:39 -0500 Subject: [PATCH 5/6] Clang fix --- src/core/memory.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/core/memory.h b/src/core/memory.h index ea122c512..47fbb14ca 100644 --- a/src/core/memory.h +++ b/src/core/memory.h @@ -165,7 +165,8 @@ public: int VirtualQuery(VAddr addr, int flags, ::Libraries::Kernel::OrbisVirtualQueryInfo* info); - int DirectMemoryQuery(PAddr addr, bool find_next, ::Libraries::Kernel::OrbisQueryInfo* out_info); + int DirectMemoryQuery(PAddr addr, bool find_next, + ::Libraries::Kernel::OrbisQueryInfo* out_info); int DirectQueryAvailable(PAddr search_start, PAddr search_end, size_t alignment, PAddr* phys_addr_out, size_t* size_out); From 04fbd7b9e775d67b9b59ed4bd0bc54ec03847cbf Mon Sep 17 00:00:00 2001 From: Stephen Miller Date: Mon, 2 Sep 2024 10:04:56 -0500 Subject: [PATCH 6/6] Clang --- src/core/memory.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/memory.h b/src/core/memory.h index 47fbb14ca..919995b0c 100644 --- a/src/core/memory.h +++ b/src/core/memory.h @@ -165,7 +165,7 @@ public: int VirtualQuery(VAddr addr, int flags, ::Libraries::Kernel::OrbisVirtualQueryInfo* info); - int DirectMemoryQuery(PAddr addr, bool find_next, + int DirectMemoryQuery(PAddr addr, bool find_next, ::Libraries::Kernel::OrbisQueryInfo* out_info); int DirectQueryAvailable(PAddr search_start, PAddr search_end, size_t alignment,