diff --git a/Core/HLE/sceKernelMutex.cpp b/Core/HLE/sceKernelMutex.cpp index 3a1c882bc5..508d2ba2c0 100644 --- a/Core/HLE/sceKernelMutex.cpp +++ b/Core/HLE/sceKernelMutex.cpp @@ -609,6 +609,11 @@ int sceKernelCreateLwMutex(MIPSState *mips, u32 workareaPtr, const char *name, u return hleLogError(Log::sceKernel, SCE_KERNEL_ERROR_ILLEGAL_COUNT); } + // A PSP rejects a misaligned work area. One it can't access hangs it instead, so for those the + // error is our choice. + if ((workareaPtr & 3) != 0) { + return hleLogError(Log::sceKernel, SCE_KERNEL_ERROR_ILLEGAL_ADDR, "misaligned workarea"); + } auto workarea = PSPPointer::Create(workareaPtr); if (!workarea.IsValid()) { return hleLogError(Log::sceKernel, SCE_KERNEL_ERROR_ILLEGAL_ADDR, "bad workarea");