mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-07-05 14:31:17 +12:00
Add debug asserts for invalid MEMPTR
Also fixed some corruptions this uncovered
This commit is contained in:
parent
7886b594a2
commit
808d1bb424
13 changed files with 193 additions and 156 deletions
|
@ -211,6 +211,7 @@ namespace coreinit
|
|||
|
||||
void __OSInitiateAlarm(OSAlarm_t* alarm, uint64 startTime, uint64 period, MPTR handlerFunc, bool isPeriodic)
|
||||
{
|
||||
cemu_assert_debug(MMU_IsInPPCMemorySpace(alarm));
|
||||
cemu_assert_debug(__OSHasSchedulerLock());
|
||||
|
||||
uint64 nextTime = startTime;
|
||||
|
|
|
@ -50,7 +50,7 @@ namespace coreinit
|
|||
MEMList g_list3;
|
||||
|
||||
std::array<uint32, 3> gHeapFillValues{ 0xC3C3C3C3, 0xF3F3F3F3, 0xD3D3D3D3 };
|
||||
OSSpinLock gHeapGlobalLock;
|
||||
SysAllocator<OSSpinLock> gHeapGlobalLock;
|
||||
MEMHeapBase* gDefaultHeap;
|
||||
|
||||
bool MEMHeapTable_Add(MEMHeapBase* heap)
|
||||
|
|
|
@ -263,9 +263,7 @@ namespace coreinit
|
|||
thread = (OSThread_t*)memory_getPointerFromVirtualOffset(coreinit_allocFromSysArea(sizeof(OSThread_t), 32));
|
||||
memset(thread, 0x00, sizeof(OSThread_t));
|
||||
// init signatures
|
||||
thread->context.magic0 = OS_CONTEXT_MAGIC_0;
|
||||
thread->context.magic1 = OS_CONTEXT_MAGIC_1;
|
||||
thread->magic = 'tHrD';
|
||||
thread->SetMagic();
|
||||
thread->type = threadType;
|
||||
thread->state = (entryPoint != MPTR_NULL) ? OSThread_t::THREAD_STATE::STATE_READY : OSThread_t::THREAD_STATE::STATE_NONE;
|
||||
thread->entrypoint = _swapEndianU32(entryPoint);
|
||||
|
@ -563,7 +561,10 @@ namespace coreinit
|
|||
// adds the thread to each core's run queue if in runable state
|
||||
void __OSAddReadyThreadToRunQueue(OSThread_t* thread)
|
||||
{
|
||||
cemu_assert_debug(MMU_IsInPPCMemorySpace(thread));
|
||||
cemu_assert_debug(thread->IsValidMagic());
|
||||
cemu_assert_debug(__OSHasSchedulerLock());
|
||||
|
||||
if (thread->state != OSThread_t::THREAD_STATE::STATE_READY)
|
||||
return;
|
||||
if (thread->suspendCounter != 0)
|
||||
|
@ -703,10 +704,18 @@ namespace coreinit
|
|||
}
|
||||
else if (prevAffinityMask != affinityMask)
|
||||
{
|
||||
__OSRemoveThreadFromRunQueues(thread);
|
||||
thread->attr = (thread->attr & ~7) | (affinityMask & 7);
|
||||
thread->context.setAffinity(affinityMask);
|
||||
__OSAddReadyThreadToRunQueue(thread);
|
||||
if(thread->state != OSThread_t::THREAD_STATE::STATE_NONE)
|
||||
{
|
||||
__OSRemoveThreadFromRunQueues(thread);
|
||||
thread->attr = (thread->attr & ~7) | (affinityMask & 7);
|
||||
thread->context.setAffinity(affinityMask);
|
||||
__OSAddReadyThreadToRunQueue(thread);
|
||||
}
|
||||
else
|
||||
{
|
||||
thread->attr = (thread->attr & ~7) | (affinityMask & 7);
|
||||
thread->context.setAffinity(affinityMask);
|
||||
}
|
||||
}
|
||||
__OSUnlockScheduler();
|
||||
return true;
|
||||
|
|
|
@ -404,6 +404,18 @@ struct OSThread_t
|
|||
return 0;
|
||||
}
|
||||
|
||||
void SetMagic()
|
||||
{
|
||||
context.magic0 = OS_CONTEXT_MAGIC_0;
|
||||
context.magic1 = OS_CONTEXT_MAGIC_1;
|
||||
magic = 'tHrD';
|
||||
}
|
||||
|
||||
bool IsValidMagic() const
|
||||
{
|
||||
return magic == 'tHrD' && context.magic0 == OS_CONTEXT_MAGIC_0 && context.magic1 == OS_CONTEXT_MAGIC_1;
|
||||
}
|
||||
|
||||
/* +0x000 */ OSContext_t context;
|
||||
/* +0x320 */ uint32be magic; // 'tHrD'
|
||||
/* +0x324 */ betype<THREAD_STATE> state;
|
||||
|
|
|
@ -82,7 +82,7 @@ namespace erreula
|
|||
|
||||
struct ErrEula_t
|
||||
{
|
||||
coreinit::OSMutex mutex;
|
||||
SysAllocator<coreinit::OSMutex> mutex;
|
||||
uint32 regionType;
|
||||
uint32 langType;
|
||||
MEMPTR<coreinit::FSClient_t> fsClient;
|
||||
|
|
|
@ -23,7 +23,7 @@ memset(bossRequest, 0, sizeof(iosuBossCemuRequest_t)); \
|
|||
memset(bossBufferVector, 0, sizeof(ioBufferVector_t)); \
|
||||
bossBufferVector->buffer = (uint8*)bossRequest;
|
||||
|
||||
coreinit::OSMutex g_mutex;
|
||||
SysAllocator<coreinit::OSMutex> g_mutex;
|
||||
sint32 g_initCounter = 0;
|
||||
bool g_isInitialized = false;
|
||||
|
||||
|
|
|
@ -54,7 +54,7 @@ namespace padscore
|
|||
WPADState_t g_wpad_state = kWPADStateMaster;
|
||||
|
||||
struct {
|
||||
coreinit::OSAlarm_t alarm;
|
||||
SysAllocator<coreinit::OSAlarm_t> alarm;
|
||||
bool kpad_initialized = false;
|
||||
|
||||
struct WPADData
|
||||
|
|
|
@ -163,7 +163,7 @@ namespace vpad
|
|||
|
||||
struct
|
||||
{
|
||||
coreinit::OSAlarm_t alarm;
|
||||
SysAllocator<coreinit::OSAlarm_t> alarm;
|
||||
|
||||
struct
|
||||
{
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue