diff --git a/Core/HLE/HLE.cpp b/Core/HLE/HLE.cpp index f336382db7..d5844d93f1 100644 --- a/Core/HLE/HLE.cpp +++ b/Core/HLE/HLE.cpp @@ -349,17 +349,19 @@ u64 hleDelayResult(u64 result, const char *reason, int usec) return result; } -void hleEatCycles(int cycles) -{ +void hleEatCycles(int cycles) { // Maybe this should Idle, at least for larger delays? Could that cause issues? currentMIPS->downcount -= cycles; } -void hleEatMicro(int usec) -{ +void hleEatMicro(int usec) { hleEatCycles((int) usToCycles(usec)); } +bool hleIsKernelMode() { + return latestSyscall && (latestSyscall->flags & HLE_KERNEL_SYSCALL) != 0; +} + const static u32 deadbeefRegs[12] = {0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF, 0xDEADBEEF}; inline static void SetDeadbeefRegs() { @@ -675,31 +677,32 @@ void hleDoLogInternal(LogTypes::LOG_TYPE t, LogTypes::LOG_LEVELS level, u64 res, const char *fmt; if (retmask == 'x') { - fmt = "%08llx=%s(%s)%s"; + fmt = "%s%08llx=%s(%s)%s"; // Truncate the high bits of the result (from any sign extension.) res = (u32)res; } else if (retmask == 'i' || retmask == 'I') { - fmt = "%lld=%s(%s)%s"; + fmt = "%s%lld=%s(%s)%s"; } else if (retmask == 'f') { // TODO: For now, floats are just shown as bits. - fmt = "%08x=%s(%s)%s"; + fmt = "%s%08x=%s(%s)%s"; } else { _assert_msg_(HLE, false, "Invalid return format: %c", retmask); - fmt = "%08llx=%s(%s)%s"; + fmt = "%s%08llx=%s(%s)%s"; } - GenericLog(level, t, file, line, fmt, res, latestSyscall->name, formatted_args, formatted_reason); + const char *kernelFlag = (latestSyscall->flags & HLE_KERNEL_SYSCALL) != 0 ? "K " : ""; + GenericLog(level, t, file, line, fmt, kernelFlag, res, latestSyscall->name, formatted_args, formatted_reason); if (reportTag != nullptr) { // A blank string means always log, not just once. if (reportTag[0] == '\0' || Reporting::ShouldLogOnce(reportTag)) { // Here we want the original key, so that different args, etc. group together. - std::string key = std::string("%08x=") + latestSyscall->name + "(%s)"; + std::string key = std::string(kernelFlag) + std::string("%08x=") + latestSyscall->name + "(%s)"; if (reason != nullptr) key += std::string(": ") + reason; char formatted_message[8192]; - snprintf(formatted_message, sizeof(formatted_message), fmt, res, latestSyscall->name, formatted_args, formatted_reason); + snprintf(formatted_message, sizeof(formatted_message), fmt, kernelFlag, res, latestSyscall->name, formatted_args, formatted_reason); Reporting::ReportMessageFormatted(key.c_str(), formatted_message); } } diff --git a/Core/HLE/HLE.h b/Core/HLE/HLE.h index a2e85db81d..7b85ac2871 100644 --- a/Core/HLE/HLE.h +++ b/Core/HLE/HLE.h @@ -36,7 +36,9 @@ enum { // Don't allow the call if dispatch or interrupts are disabled. HLE_NOT_DISPATCH_SUSPENDED = 1 << 9, // Indicates the call should write zeros to the stack (stackBytesToClear in the table.) - HLE_CLEAR_STACK_BYTES = 1 << 10 + HLE_CLEAR_STACK_BYTES = 1 << 10, + // Indicates that this call operates in kernel mode. + HLE_KERNEL_SYSCALL = 1 < 11, }; struct HLEFunction @@ -116,6 +118,8 @@ void hleDebugBreak(); void hleSkipDeadbeef(); // Set time spent in debugger (for more useful debug stats while debugging.) void hleSetSteppingTime(double t); +// Check if the current syscall context is kernel. +bool hleIsKernelMode(); // Delays the result for usec microseconds, allowing other threads to run during this time. u32 hleDelayResult(u32 result, const char *reason, int usec); diff --git a/Core/HLE/HLETables.cpp b/Core/HLE/HLETables.cpp index 915e8434cb..9d49837120 100644 --- a/Core/HLE/HLETables.cpp +++ b/Core/HLE/HLETables.cpp @@ -180,7 +180,7 @@ const HLEFunction LoadCoreForKernel[] = {0XB4D6FECC, nullptr, "sceKernelApplyElfRelSection", '?', "" }, {0X54AB2675, nullptr, "sceKernelApplyPspRelSection", '?', "" }, {0X2952F5AC, nullptr, "sceKernelDcacheWBinvAll", '?', "" }, - {0XD8779AC6, &WrapU_V, "sceKernelIcacheClearAll", 'x', "" }, + {0xD8779AC6, &WrapU_V, "sceKernelIcacheClearAll", 'x', "", HLE_KERNEL_SYSCALL }, {0X99A695F0, nullptr, "sceKernelRegisterLibrary", '?', "" }, {0X5873A31F, nullptr, "sceKernelRegisterLibraryForUser", '?', "" }, {0X0B464512, nullptr, "sceKernelReleaseLibrary", '?', "" }, @@ -202,7 +202,7 @@ const HLEFunction LoadCoreForKernel[] = {0XCCE4A157, nullptr, "sceKernelFindModuleByUID", '?', "" }, {0X82CE54ED, nullptr, "sceKernelModuleCount", '?', "" }, {0XC0584F0C, nullptr, "sceKernelGetModuleList", '?', "" }, - {0XCF8A41B1, &WrapU_C, "sceKernelFindModuleByName", 'x', "s" }, + {0XCF8A41B1, &WrapU_C, "sceKernelFindModuleByName", 'x', "s", HLE_KERNEL_SYSCALL }, {0XB95FA50D, nullptr, "LoadCoreForKernel_B95FA50D", '?', "" }, }; @@ -213,7 +213,7 @@ const HLEFunction KDebugForKernel[] = {0X2FF4E9F9, nullptr, "sceKernelAssert", '?', "" }, {0X9B868276, nullptr, "sceKernelGetDebugPutchar", '?', "" }, {0XE146606D, nullptr, "sceKernelRegisterDebugPutchar", '?', "" }, - {0X7CEB2C09, &WrapU_V, "sceKernelRegisterKprintfHandler", 'x', "" }, + {0X7CEB2C09, &WrapU_V, "sceKernelRegisterKprintfHandler", 'x', "", HLE_KERNEL_SYSCALL }, {0X84F370BC, nullptr, "Kprintf", '?', "" }, {0X5CE9838B, nullptr, "sceKernelDebugWrite", '?', "" }, {0X66253C4E, nullptr, "sceKernelRegisterDebugWrite", '?', "" }, diff --git a/Core/HLE/sceKernel.cpp b/Core/HLE/sceKernel.cpp index 80a8eecf23..c3913d7400 100644 --- a/Core/HLE/sceKernel.cpp +++ b/Core/HLE/sceKernel.cpp @@ -671,24 +671,6 @@ static int sceKernelReferGlobalProfiler(u32 statusPtr) { return 0; } -static int ThreadManForKernel_446d8de6(const char *threadName, u32 entry, u32 prio, int stacksize, u32 attr, u32 optionAddr) -{ - WARN_LOG(SCEKERNEL,"ThreadManForKernel_446d8de6:Not support this patcher"); - return sceKernelCreateThread(threadName, entry, prio, stacksize, attr, optionAddr); -} - -static int ThreadManForKernel_f475845d(SceUID threadToStartID, int argSize, u32 argBlockPtr) -{ - WARN_LOG(SCEKERNEL,"ThreadManForKernel_f475845d:Not support this patcher"); - return sceKernelStartThread(threadToStartID,argSize,argBlockPtr); -} - -static int ThreadManForKernel_ceadeb47(u32 usec) -{ - WARN_LOG(SCEKERNEL,"ThreadManForKernel_ceadeb47:Not support this patcher"); - return sceKernelDelayThread(usec); -} - const HLEFunction ThreadManForUser[] = { {0X55C20A00, &WrapI_CUUU, "sceKernelCreateEventFlag", 'i', "sxxx" }, @@ -873,9 +855,9 @@ const HLEFunction ThreadManForUser[] = const HLEFunction ThreadManForKernel[] = { - {0XCEADEB47, &WrapI_U, "ThreadManForKernel_ceadeb47", 'i', "x" }, - {0X446D8DE6, &WrapI_CUUIUU, "ThreadManForKernel_446d8de6", 'i', "sxxixx" },//Not sure right - {0XF475845D, &WrapI_IIU, "ThreadManForKernel_f475845d", 'i', "iix" },//Not sure right + {0xCEADEB47, &WrapI_U, "sceKernelDelayThread", 'i', "x", HLE_NOT_IN_INTERRUPT | HLE_NOT_DISPATCH_SUSPENDED | HLE_KERNEL_SYSCALL }, + {0x446D8DE6, &WrapI_CUUIUU, "sceKernelCreateThread", 'i', "sxxixx", HLE_NOT_IN_INTERRUPT | HLE_KERNEL_SYSCALL }, + {0xF475845D, &WrapI_IIU, "sceKernelStartThread", 'i', "iix", HLE_NOT_IN_INTERRUPT | HLE_KERNEL_SYSCALL }, }; void Register_ThreadManForUser() @@ -898,16 +880,10 @@ void Register_LoadExecForUser() { RegisterModule("LoadExecForUser", ARRAY_SIZE(LoadExecForUser), LoadExecForUser); } - -static int LoadExecForKernel_4AC57943(SceUID cbId) -{ - WARN_LOG(SCEKERNEL,"LoadExecForKernel_4AC57943:Not support this patcher"); - return sceKernelRegisterExitCallback(cbId);//not sure right -} const HLEFunction LoadExecForKernel[] = { - {0X4AC57943, &WrapI_I, "LoadExecForKernel_4AC57943", 'i', "i" }, + {0x4AC57943, &WrapI_I, "sceKernelRegisterExitCallback", 'i', "i", HLE_KERNEL_SYSCALL }, {0XA3D5E142, nullptr, "LoadExecForKernel_a3d5e142", '?', "" }, }; @@ -927,7 +903,7 @@ const HLEFunction ExceptionManagerForKernel[] = { {0X3FB264FC, nullptr, "sceKernelRegisterExceptionHandler", '?', "" }, {0X5A837AD4, nullptr, "sceKernelRegisterPriorityExceptionHandler", '?', "" }, - {0x565C0B0E, &WrapI_V, "sceKernelRegisterDefaultExceptionHandler", 'i', "" }, + {0x565C0B0E, &WrapI_V, "sceKernelRegisterDefaultExceptionHandler", 'i', "", HLE_KERNEL_SYSCALL }, {0X1AA6CFFA, nullptr, "sceKernelReleaseExceptionHandler", '?', "" }, {0XDF83875E, nullptr, "sceKernelGetActiveDefaultExceptionHandler", '?', "" }, {0X291FF031, nullptr, "sceKernelReleaseDefaultExceptionHandler", '?', "" }, @@ -947,7 +923,7 @@ void Register_ExceptionManagerForKernel() // Seen in some homebrew const HLEFunction UtilsForKernel[] = { - {0XC2DF770E, WrapI_UI, "sceKernelIcacheInvalidateRange", '?', "" }, + {0xC2DF770E, WrapI_UI, "sceKernelIcacheInvalidateRange", '?', "", HLE_KERNEL_SYSCALL }, {0X78934841, nullptr, "sceKernelGzipDecompress", '?', "" }, {0XE8DB3CE6, nullptr, "sceKernelDeflateDecompress", '?', "" }, {0X840259F1, nullptr, "sceKernelUtilsSha1Digest", '?', "" }, diff --git a/Core/HLE/sceKernelInterrupt.cpp b/Core/HLE/sceKernelInterrupt.cpp index 19f118d72f..ba9d7c1588 100644 --- a/Core/HLE/sceKernelInterrupt.cpp +++ b/Core/HLE/sceKernelInterrupt.cpp @@ -729,14 +729,14 @@ static u32 sysclib_memset(u32 destAddr, int data, int size) { const HLEFunction SysclibForKernel[] = { - {0XAB7592FF, &WrapU_UUU, "memcpy", 'x', "xxx" }, - {0X476FD94A, &WrapU_UU, "strcat", 'x', "xx" }, - {0XC0AB8932, &WrapI_UU, "strcmp", 'i', "xx" }, - {0XEC6F1CF2, &WrapU_UU, "strcpy", 'x', "xx" }, - {0X52DF196C, &WrapU_U, "strlen", 'x', "x" }, - {0X81D0D1F7, &WrapI_UUU, "memcmp", 'i', "xxx" }, - {0X7661E728, &WrapI_UU, "sprintf", 'i', "xx" }, - {0X10F3BB61, &WrapU_UII, "memset", 'x', "xii" }, + {0xAB7592FF, &WrapU_UUU, "memcpy", 'x', "xxx", HLE_KERNEL_SYSCALL }, + {0x476FD94A, &WrapU_UU, "strcat", 'x', "xx", HLE_KERNEL_SYSCALL }, + {0xC0AB8932, &WrapI_UU, "strcmp", 'i', "xx", HLE_KERNEL_SYSCALL }, + {0xEC6F1CF2, &WrapU_UU, "strcpy", 'x', "xx", HLE_KERNEL_SYSCALL }, + {0x52DF196C, &WrapU_U, "strlen", 'x', "x", HLE_KERNEL_SYSCALL }, + {0x81D0D1F7, &WrapI_UUU, "memcmp", 'i', "xxx", HLE_KERNEL_SYSCALL }, + {0x7661E728, &WrapI_UU, "sprintf", 'i', "xx", HLE_KERNEL_SYSCALL }, + {0x10F3BB61, &WrapU_UII, "memset", 'x', "xii", HLE_KERNEL_SYSCALL }, }; void Register_Kernel_Library() diff --git a/Core/HLE/sceKernelModule.cpp b/Core/HLE/sceKernelModule.cpp index 6b293e6357..1e62f3b46f 100644 --- a/Core/HLE/sceKernelModule.cpp +++ b/Core/HLE/sceKernelModule.cpp @@ -2326,22 +2326,8 @@ static u32 sceKernelGetModuleIdList(u32 resultBuffer, u32 resultBufferSize, u32 return 0; } -static u32 ModuleMgrForKernel_977de386(const char *name, u32 flags, u32 optionAddr) -{ - WARN_LOG(SCEMODULE,"ModuleMgrForKernel_977de386:Not support this patcher"); - return sceKernelLoadModule(name, flags, optionAddr); -} - -static void ModuleMgrForKernel_50f0c1ec(u32 moduleId, u32 argsize, u32 argAddr, u32 returnValueAddr, u32 optionAddr) -{ - WARN_LOG(SCEMODULE,"ModuleMgrForKernel_50f0c1ec:Not support this patcher"); - sceKernelStartModule(moduleId, argsize, argAddr, returnValueAddr, optionAddr); -} - //fix for tiger x dragon -static u32 ModuleMgrForKernel_a1a78c58(const char *name, u32 flags, u32 optionAddr) -{ - WARN_LOG(SCEMODULE,"ModuleMgrForKernel_a1a78c58:Not support this patcher"); +static u32 sceKernelLoadModuleForLoadExecVSHDisc(const char *name, u32 flags, u32 optionAddr) { return sceKernelLoadModule(name, flags, optionAddr); } @@ -2370,11 +2356,11 @@ const HLEFunction ModuleMgrForUser[] = const HLEFunction ModuleMgrForKernel[] = { - {0X50F0C1EC, &WrapV_UUUUU, "ModuleMgrForKernel_50f0c1ec", 'v', "xxxxx" },//Not sure right - {0X977DE386, &WrapU_CUU, "ModuleMgrForKernel_977de386", 'x', "sxx" },//Not sure right - {0XA1A78C58, &WrapU_CUU, "ModuleMgrForKernel_a1a78c58", 'x', "sxx" }, //fix for tiger x dragon - {0X748CBED9, &WrapU_UU, "sceKernelQueryModuleInfo", 'x', "xx" },//Bugz Homebrew - {0X644395E2, &WrapU_UUU, "sceKernelGetModuleIdList", 'x', "xxx" },//Bugz Homebrew + {0x50F0C1EC, &WrapV_UUUUU, "sceKernelStartModule", 'v', "xxxxx", HLE_NOT_IN_INTERRUPT | HLE_NOT_DISPATCH_SUSPENDED | HLE_KERNEL_SYSCALL }, + {0x977DE386, &WrapU_CUU, "sceKernelLoadModule", 'x', "sxx", HLE_KERNEL_SYSCALL }, + {0xA1A78C58, &WrapU_CUU, "sceKernelLoadModuleForLoadExecVSHDisc", 'x', "sxx", HLE_KERNEL_SYSCALL }, //fix for tiger x dragon + {0x748CBED9, &WrapU_UU, "sceKernelQueryModuleInfo", 'x', "xx", HLE_KERNEL_SYSCALL }, + {0x644395E2, &WrapU_UUU, "sceKernelGetModuleIdList", 'x', "xxx", HLE_KERNEL_SYSCALL }, }; void Register_ModuleMgrForUser()