diff --git a/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp b/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp index de3618d275..d97165b960 100644 --- a/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp +++ b/rpcs3/Emu/ARMv7/Modules/sceLibKernel.cpp @@ -31,14 +31,7 @@ s32 sceKernelGetMemBlockInfoByAddr(vm::ptr vbase, vm::ptr pName, - vm::ptr entry, - s32 initPriority, - u32 stackSize, - u32 attr, - s32 cpuAffinityMask, - vm::cptr pOptParam) +s32 sceKernelCreateThread(vm::cptr pName, vm::ptr entry, s32 initPriority, u32 stackSize, u32 attr, s32 cpuAffinityMask, vm::cptr pOptParam) { sceLibKernel.Warning("sceKernelCreateThread(pName=*0x%x, entry=*0x%x, initPriority=%d, stackSize=0x%x, attr=0x%x, cpuAffinityMask=0x%x, pOptParam=*0x%x)", pName, entry, initPriority, stackSize, attr, cpuAffinityMask, pOptParam); @@ -219,9 +212,22 @@ s32 sceKernelGetSystemInfo(vm::ptr pInfo) s32 sceKernelGetThreadmgrUIDClass(s32 uid) { - sceLibKernel.Todo("sceKernelGetThreadmgrUIDClass(uid=0x%x)", uid); + sceLibKernel.Error("sceKernelGetThreadmgrUIDClass(uid=0x%x)", uid); - throw EXCEPTION(""); + const auto type = idm::get_type(uid); + + if (!type) + { + return SCE_KERNEL_ERROR_INVALID_UID; + } + + if (*type == typeid(ARMv7Thread)) return SCE_KERNEL_THREADMGR_UID_CLASS_THREAD; + if (*type == typeid(psv_semaphore_t)) return SCE_KERNEL_THREADMGR_UID_CLASS_SEMA; + if (*type == typeid(psv_event_flag_t)) return SCE_KERNEL_THREADMGR_UID_CLASS_EVENT_FLAG; + if (*type == typeid(psv_mutex_t)) return SCE_KERNEL_THREADMGR_UID_CLASS_MUTEX; + if (*type == typeid(psv_cond_t)) return SCE_KERNEL_THREADMGR_UID_CLASS_COND; + + throw EXCEPTION("Unknown UID class (type='%s')", type->name()); } s32 sceKernelChangeThreadVfpException(s32 clearMask, s32 setMask) diff --git a/rpcs3/Emu/IdManager.h b/rpcs3/Emu/IdManager.h index 28f1058248..47aca64a5a 100644 --- a/rpcs3/Emu/IdManager.h +++ b/rpcs3/Emu/IdManager.h @@ -33,7 +33,7 @@ namespace idm // reinitialize ID manager void clear(); - // check if ID exists + // check if ID of specified type exists template bool check(u32 id) { extern std::mutex g_id_mutex; @@ -41,9 +41,22 @@ namespace idm std::lock_guard lock(g_id_mutex); - const auto f = g_id_map.find(id); + const auto found = g_id_map.find(id); - return f != g_id_map.end() && f->second.info == typeid(T); + return found != g_id_map.end() && found->second.info == typeid(T); + } + + // check if ID exists and return its type or nullptr + inline const std::type_info* get_type(u32 id) + { + extern std::mutex g_id_mutex; + extern std::unordered_map g_id_map; + + std::lock_guard lock(g_id_mutex); + + const auto found = g_id_map.find(id); + + return found == g_id_map.end() ? nullptr : &found->second.info; } // must be called from the constructor called through make() or make_ptr() to get further ID of current object