diff --git a/Core/HLE/sceKernelThread.cpp b/Core/HLE/sceKernelThread.cpp index 2e75cef841..1d5bc12cae 100644 --- a/Core/HLE/sceKernelThread.cpp +++ b/Core/HLE/sceKernelThread.cpp @@ -92,8 +92,8 @@ enum { PSP_THREAD_ATTR_KERNEL = 0x00001000, PSP_THREAD_ATTR_VFPU = 0x00004000, PSP_THREAD_ATTR_SCRATCH_SRAM = 0x00008000, // Save/restore scratch as part of context??? - PSP_THREAD_ATTR_NO_FILLSTACK = 0x00100000, // No filling of 0xff (only with PSP_THREAD_ATTR_LOW_STACK?) - PSP_THREAD_ATTR_CLEAR_STACK = 0x00200000, // TODO: Clear thread stack when deleted + PSP_THREAD_ATTR_NO_FILLSTACK = 0x00100000, // No filling of 0xff. + PSP_THREAD_ATTR_CLEAR_STACK = 0x00200000, // Clear thread stack when deleted. PSP_THREAD_ATTR_LOW_STACK = 0x00400000, // Allocate stack from bottom not top. PSP_THREAD_ATTR_USER = 0x80000000, PSP_THREAD_ATTR_USBWLAN = 0xa0000000, @@ -102,7 +102,7 @@ enum { // TODO: Support more, not even sure what all of these mean. PSP_THREAD_ATTR_USER_MASK = 0xf8f060ff, PSP_THREAD_ATTR_USER_ERASE = 0x78800000, - PSP_THREAD_ATTR_SUPPORTED = (PSP_THREAD_ATTR_KERNEL | PSP_THREAD_ATTR_VFPU | PSP_THREAD_ATTR_NO_FILLSTACK | PSP_THREAD_ATTR_LOW_STACK | PSP_THREAD_ATTR_USER) + PSP_THREAD_ATTR_SUPPORTED = (PSP_THREAD_ATTR_KERNEL | PSP_THREAD_ATTR_VFPU | PSP_THREAD_ATTR_NO_FILLSTACK | PSP_THREAD_ATTR_CLEAR_STACK | PSP_THREAD_ATTR_LOW_STACK | PSP_THREAD_ATTR_USER) }; struct NativeCallback @@ -436,6 +436,11 @@ public: void FreeStack() { if (currentStack.start != 0) { DEBUG_LOG(SCEKERNEL, "Freeing thread stack %s", nt.name); + + if (nt.attr & PSP_THREAD_ATTR_CLEAR_STACK) { + Memory::Memset(currentStack.start, 0, currentStack.end - currentStack.start); + } + if (nt.attr & PSP_THREAD_ATTR_KERNEL) { kernelMemory.Free(currentStack.start); } else {