diff --git a/core/libs/prx/libSceLibcInternal/Export.cpp b/core/libs/prx/libSceLibcInternal/Export.cpp index 7541f8ed1..6597f5f5b 100644 --- a/core/libs/prx/libSceLibcInternal/Export.cpp +++ b/core/libs/prx/libSceLibcInternal/Export.cpp @@ -1,14 +1,9 @@ -#include -#include -#include "SceTypes.hpp" -#include "prx/libc/include/General.hpp" +#include "prx/libc/include/HeapDiagnostics.hpp" extern "C" { - void APS5_VABI sceLibcHeapGetTraceInfo_nid_postfix(Info* info) { - (void)info; - NotImplemented_nid_no_patch(__func__); + LibcHeapTraceInfo_nid_no_patch(info); } } diff --git a/core/libs/prx/libc/Export.cpp b/core/libs/prx/libc/Export.cpp index a7bacbfde..4e0c3813a 100644 --- a/core/libs/prx/libc/Export.cpp +++ b/core/libs/prx/libc/Export.cpp @@ -2,6 +2,7 @@ #include #include "SceTypes.hpp" #include "prx/libc/include/General.hpp" +#include "prx/libc/include/HeapDiagnostics.hpp" uint32_t Need_sceLibc = 1; @@ -39,8 +40,7 @@ extern "C" { } void APS5_VABI LibcHeapGetTraceInfo_nid_postfix(LibcHeapInfo* info) { - (void)info; - NotImplemented_nid_no_patch(__func__); + LibcHeapTraceInfo_nid_no_patch(info); } int APS5_VABI LibcInternalExtCxaThreadAtexit_nid_postfix(void (*destructor)(void*), void* object, void* module_id) { diff --git a/core/libs/prx/libc/include/HeapDiagnostics.hpp b/core/libs/prx/libc/include/HeapDiagnostics.hpp new file mode 100644 index 000000000..7d3d62454 --- /dev/null +++ b/core/libs/prx/libc/include/HeapDiagnostics.hpp @@ -0,0 +1,8 @@ +#ifndef CORE_LIBS_PRX_LIBC_INCLUDE_HEAPDIAGNOSTICS_HPP +#define CORE_LIBS_PRX_LIBC_INCLUDE_HEAPDIAGNOSTICS_HPP + +#include "SceTypes.hpp" + +extern "C" void LibcHeapTraceInfo_nid_no_patch(LibcHeapInfo* info); + +#endif diff --git a/core/libs/prx/libc/src/HeapDiagnostics.cpp b/core/libs/prx/libc/src/HeapDiagnostics.cpp index fc9dd761f..39aaf3951 100644 --- a/core/libs/prx/libc/src/HeapDiagnostics.cpp +++ b/core/libs/prx/libc/src/HeapDiagnostics.cpp @@ -1,8 +1,33 @@ #include "prx/libc/include/General.hpp" +#include "prx/libc/include/HeapDiagnostics.hpp" +#include +#include #include +#include + +namespace { + +std::uint64_t mspaceAtomicIdMask = 0; +std::array mstateTable{}; + +static_assert(sizeof(LibcHeapInfo) == 32); +static_assert(offsetof(LibcHeapInfo, mspace_atomic_id_mask) == 16); +static_assert(offsetof(LibcHeapInfo, mstate_table) == 24); + +} extern "C" { +void LibcHeapTraceInfo_nid_no_patch(LibcHeapInfo* info) { + if (info == nullptr) + throw std::invalid_argument("heap trace info: null output"); + if (info->size != sizeof(LibcHeapInfo)) + throw std::invalid_argument("heap trace info: unsupported structure size"); + info->unknown2 = 0; + info->mspace_atomic_id_mask = &mspaceAtomicIdMask; + info->mstate_table = mstateTable.data(); +} + // unknown signature void APS5_VABI sceLibcInternalBacktraceForGame_nid_postfix(const char* heapName) { (void)heapName;