accurate heap api

- modified HeapAPI to a struct with preset function fields
- utilized the full array parameter passed to _sceKernelRtldSetApplicationHeapAPI
This commit is contained in:
microsoftv 2024-08-10 12:45:09 -04:00
parent 4a2cc38511
commit 8c5db7c800
5 changed files with 18 additions and 11 deletions

View File

@ -212,9 +212,9 @@ s32 PS4_SYSV_ABI sceKernelAvailableFlexibleMemorySize(size_t* out_size) {
return ORBIS_OK; return ORBIS_OK;
} }
void PS4_SYSV_ABI _sceKernelRtldSetApplicationHeapAPI(void* func) { void PS4_SYSV_ABI _sceKernelRtldSetApplicationHeapAPI(void* func[]) {
auto* linker = Common::Singleton<Core::Linker>::Instance(); auto* linker = Common::Singleton<Core::Linker>::Instance();
linker->SetHeapApiFunc(func); linker->SetHeapAPI(func);
} }
int PS4_SYSV_ABI sceKernelGetDirectMemoryType(u64 addr, int* directMemoryTypeOut, int PS4_SYSV_ABI sceKernelGetDirectMemoryType(u64 addr, int* directMemoryTypeOut,

View File

@ -98,7 +98,7 @@ int PS4_SYSV_ABI sceKernelQueryMemoryProtection(void* addr, void** start, void**
int PS4_SYSV_ABI sceKernelDirectMemoryQuery(u64 offset, int flags, OrbisQueryInfo* query_info, int PS4_SYSV_ABI sceKernelDirectMemoryQuery(u64 offset, int flags, OrbisQueryInfo* query_info,
size_t infoSize); size_t infoSize);
s32 PS4_SYSV_ABI sceKernelAvailableFlexibleMemorySize(size_t* sizeOut); s32 PS4_SYSV_ABI sceKernelAvailableFlexibleMemorySize(size_t* sizeOut);
void PS4_SYSV_ABI _sceKernelRtldSetApplicationHeapAPI(void* func); void PS4_SYSV_ABI _sceKernelRtldSetApplicationHeapAPI(void* func[]);
int PS4_SYSV_ABI sceKernelGetDirectMemoryType(u64 addr, int* directMemoryTypeOut, int PS4_SYSV_ABI sceKernelGetDirectMemoryType(u64 addr, int* directMemoryTypeOut,
void** directMemoryStartOut, void** directMemoryStartOut,
void** directMemoryEndOut); void** directMemoryEndOut);

View File

@ -434,7 +434,7 @@ int PS4_SYSV_ABI scePthreadMutexInit(ScePthreadMutex* mutex, const ScePthreadMut
if (*mutex_attr == nullptr) { if (*mutex_attr == nullptr) {
attr = g_pthread_cxt->getDefaultMutexattr(); attr = g_pthread_cxt->getDefaultMutexattr();
} else { } else {
attr = *mutex_attr; attr = mutex_attr;
} }
} }

View File

@ -305,7 +305,7 @@ void* Linker::TlsGetAddr(u64 module_index, u64 offset) {
// Module was just loaded by above code. Allocate TLS block for it. // Module was just loaded by above code. Allocate TLS block for it.
Module* module = m_modules[module_index - 1].get(); Module* module = m_modules[module_index - 1].get();
const u32 init_image_size = module->tls.init_image_size; const u32 init_image_size = module->tls.init_image_size;
u8* dest = reinterpret_cast<u8*>(heap_api_func(module->tls.image_size)); u8* dest = reinterpret_cast<u8*>(heap_api->heap_malloc(module->tls.image_size));
const u8* src = reinterpret_cast<const u8*>(module->tls.image_virtual_addr); const u8* src = reinterpret_cast<const u8*>(module->tls.image_virtual_addr);
std::memcpy(dest, src, init_image_size); std::memcpy(dest, src, init_image_size);
std::memset(dest + init_image_size, 0, module->tls.image_size - init_image_size); std::memset(dest + init_image_size, 0, module->tls.image_size - init_image_size);
@ -335,8 +335,8 @@ void Linker::InitTlsForThread(bool is_primary) {
&addr_out, tls_aligned, 3, 0, "SceKernelPrimaryTcbTls"); &addr_out, tls_aligned, 3, 0, "SceKernelPrimaryTcbTls");
ASSERT_MSG(ret == 0, "Unable to allocate TLS+TCB for the primary thread"); ASSERT_MSG(ret == 0, "Unable to allocate TLS+TCB for the primary thread");
} else { } else {
if (heap_api_func) { if (heap_api) {
addr_out = heap_api_func(total_tls_size); addr_out = heap_api->heap_malloc(total_tls_size);
} else { } else {
addr_out = std::malloc(total_tls_size); addr_out = std::malloc(total_tls_size);
} }

View File

@ -46,7 +46,14 @@ struct EntryParams {
const char* argv[3]; const char* argv[3];
}; };
using HeapApiFunc = PS4_SYSV_ABI void* (*)(size_t); struct HeapAPI {
PS4_SYSV_ABI void* (*heap_malloc)(size_t);
PS4_SYSV_ABI void (*heap_free)(void*);
PS4_SYSV_ABI void* unkn[4];
PS4_SYSV_ABI int (*posix_memalign)(size_t, void**, size_t);
};
typedef HeapAPI* AppHeapAPI;
class Linker { class Linker {
public: public:
@ -75,8 +82,8 @@ public:
} }
} }
void SetHeapApiFunc(void* func) { void SetHeapAPI(void* func[]) {
heap_api_func = *reinterpret_cast<HeapApiFunc*>(func); heap_api = reinterpret_cast<AppHeapAPI>(func);
} }
void AdvanceGenerationCounter() noexcept { void AdvanceGenerationCounter() noexcept {
@ -104,7 +111,7 @@ private:
size_t static_tls_size{}; size_t static_tls_size{};
u32 max_tls_index{}; u32 max_tls_index{};
u32 num_static_modules{}; u32 num_static_modules{};
HeapApiFunc heap_api_func{}; AppHeapAPI heap_api{};
std::vector<std::unique_ptr<Module>> m_modules; std::vector<std::unique_ptr<Module>> m_modules;
Loader::SymbolsResolver m_hle_symbols{}; Loader::SymbolsResolver m_hle_symbols{};
}; };