From 28879934d61733faae9a44093e6e7c41cc17190f Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Tue, 6 Nov 2012 16:20:13 +0100 Subject: [PATCH] Add some missing HLE functions, fix loading unencrypted EBOOT.BIN --- Core/HLE/sceAudio.cpp | 3 ++- Core/HLE/sceKernel.cpp | 5 ++++- Core/HLE/sceKernelInterrupt.cpp | 1 + Core/HLE/sceKernelMemory.cpp | 4 ++++ Core/HLE/sceKernelThread.cpp | 9 ++++++++- Core/HLE/sceKernelThread.h | 1 + Core/PSPLoaders.cpp | 3 +-- 7 files changed, 21 insertions(+), 5 deletions(-) diff --git a/Core/HLE/sceAudio.cpp b/Core/HLE/sceAudio.cpp index 1cf7644ff9..3dfc56138d 100644 --- a/Core/HLE/sceAudio.cpp +++ b/Core/HLE/sceAudio.cpp @@ -238,11 +238,12 @@ void sceAudioInit() const HLEFunction sceAudio[] = { - {0x01562ba3, 0, "sceAudioOutput2Reserve"}, + {0x01562ba3, 0, "sceAudioOutput2Reserve"}, // Super Stardust Portable uses these {0x2d53f36e, 0, "sceAudioOutput2OutputBlocking"}, {0x63f2889c, 0, "sceAudioOutput2ChangeLength"}, {0x647cef33, 0, "sceAudioOutput2GetRestSample"}, {0x43196845, 0, "sceAudioOutput2Release"}, + {0x210567F7, 0, "sceAudioEnd"}, {0x38553111, 0, "sceAudioSRCChReserve"}, {0x5C37C0AE, 0, "sceAudioSRCChRelease"}, diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index bd8d92bbec..3e8281ddcb 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -295,6 +295,8 @@ const HLEFunction ThreadManForUser[] = {0x5bf4dd27,&WrapU_UUU,"sceKernelLockMutexCB"}, {0x6b30100f,&WrapU_UU,"sceKernelUnlockMutex"}, {0xb7d098c6,&WrapU_CUU,"sceKernelCreateMutex"}, + {0x0DDCD2C9, 0, "sceKernelTryLockMutex"}, + // NOTE: LockLwMutex and UnlockLwMutex are in Kernel_Library, see sceKernelInterrupt.cpp. {0xFCCFAD26,0,"sceKernelCancelWakeupThread"}, @@ -308,7 +310,7 @@ const HLEFunction ThreadManForUser[] = {0x68da9e36,sceKernelDelayThreadCB,"sceKernelDelayThreadCB"}, {0xaa73c935,sceKernelExitThread,"sceKernelExitThread"}, {0x809ce29b,sceKernelExitDeleteThread,"sceKernelExitDeleteThread"}, - {0x94aa61ee,0,"sceKernelGetThreadCurrentPriority"}, + {0x94aa61ee,sceKernelGetThreadCurrentPriority,"sceKernelGetThreadCurrentPriority"}, {0x293b45b8,sceKernelGetThreadId,"sceKernelGetThreadId"}, {0x3B183E26,sceKernelGetThreadExitStatus,"sceKernelGetThreadExitStatus"}, {0x52089CA1,sceKernelGetThreadStackFreeSize,"sceKernelGetThreadStackFreeSize"}, @@ -423,6 +425,7 @@ const HLEFunction ThreadManForUser[] = {0x0E927AED, _sceKernelReturnFromTimerHandler, "_sceKernelReturnFromTimerHandler"}, {0x532A522E, _sceKernelExitThread,"_sceKernelExitThread"}, + // Shouldn't hook this up. No games should import this function manually and call it. // {0x6E9EA350, _sceKernelReturnFromCallback,"_sceKernelReturnFromCallback"}, }; diff --git a/Core/HLE/sceKernelInterrupt.cpp b/Core/HLE/sceKernelInterrupt.cpp index db53d54a22..7db8000a13 100644 --- a/Core/HLE/sceKernelInterrupt.cpp +++ b/Core/HLE/sceKernelInterrupt.cpp @@ -388,6 +388,7 @@ const HLEFunction Kernel_Library[] = {0x47a0b729,sceKernelIsCpuIntrSuspended, "sceKernelIsCpuIntrSuspended"}, //flags {0xb55249d2,sceKernelIsCpuIntrEnable, "sceKernelIsCpuIntrEnable"}, {0xa089eca4,sceKernelMemset, "sceKernelMemset"}, + {0xDC692EE3,0, "sceKernelTryLockLwMutex"}, {0xbea46419,0, "sceKernelLockLwMutex"}, {0x15b6446b,0, "sceKernelUnlockLwMutex"}, {0x293b45b8,0, "sceKernelGetThreadId"}, diff --git a/Core/HLE/sceKernelMemory.cpp b/Core/HLE/sceKernelMemory.cpp index 3049d35a35..8c7a79d2db 100644 --- a/Core/HLE/sceKernelMemory.cpp +++ b/Core/HLE/sceKernelMemory.cpp @@ -637,6 +637,10 @@ const HLEFunction SysMemUserForUser[] = {0xf77d77cb,sceKernelSetCompilerVersion,"sceKernelSetCompilerVersion"}, {0x35669d4c,0,"sceKernelSetCompiledSdkVersion600_602"}, //?? {0x1b4217bc,0,"sceKernelSetCompiledSdkVersion603_605"}, + {0xDB83A952,0,"SysMemUserForUser_DB83A952"}, + {0x91DE343C,0,"SysMemUserForUser_91DE343C"}, + {0x50F61D8A,0,"SysMemUserForUser_50F61D8A"}, + {0xFE707FDF,0,"SysMemUserForUser_FE707FDF"}, }; diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index af21990a06..168e51b139 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -994,6 +994,13 @@ void sceKernelGetThreadId() RETURN(retVal); } +void sceKernelGetThreadCurrentPriority() +{ + u32 retVal = __GetCurrentThread()->nt.currentPriority; + DEBUG_LOG(HLE,"%i = sceKernelGetThreadCurrentPriority()", retVal); + RETURN(retVal); +} + void sceKernelChangeCurrentThreadAttr() { int clearAttr = PARAM(0); @@ -1018,7 +1025,7 @@ void sceKernelChangeThreadPriority() } else { - ERROR_LOG(HLE,"%08x=sceKernelChangeThreadPriority(%i, %i) failed", error, id, PARAM(1)); + ERROR_LOG(HLE,"%08x=sceKernelChangeThreadPriority(%i, %i) failed - no such thread", error, id, PARAM(1)); RETURN(error); } } diff --git a/Core/HLE/sceKernelThread.h b/Core/HLE/sceKernelThread.h index 9bca5a566e..c960798119 100644 --- a/Core/HLE/sceKernelThread.h +++ b/Core/HLE/sceKernelThread.h @@ -34,6 +34,7 @@ void sceKernelExitDeleteThread(); void sceKernelExitThread(); void _sceKernelExitThread(); void sceKernelGetThreadId(); +void sceKernelGetThreadCurrentPriority(); u32 sceKernelStartThread(); void sceKernelWaitThreadEnd(); void sceKernelReferThreadStatus(); diff --git a/Core/PSPLoaders.cpp b/Core/PSPLoaders.cpp index 911549236a..bada1d5c79 100644 --- a/Core/PSPLoaders.cpp +++ b/Core/PSPLoaders.cpp @@ -71,8 +71,7 @@ bool Load_PSP_ISO(const char *filename, std::string *error_string) { u8 head[4]; pspFileSystem.ReadFile(fd, head, 4); - if (memcmp(head, "~PSP", 4) == 0) // || memcmp(head + 1, "ELF", 3) == 0) - { + if (memcmp(head, "~PSP", 4) == 0 || memcmp(head, "\x7F""ELF", 4) == 0) { hasEncrypted = true; } }