Skip to content

Commit 808d1bb

Browse files
committed
Add debug asserts for invalid MEMPTR
Also fixed some corruptions this uncovered
1 parent 7886b59 commit 808d1bb

File tree

13 files changed

+199
-162
lines changed

13 files changed

+199
-162
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ bin/debugger/*
3838
bin/sdcard/*
3939
bin/screenshots/*
4040
bin/dump/*
41+
bin/cafeLibs/*
4142

4243
!bin/shaderCache/info.txt
4344
bin/shaderCache/*

src/Cafe/HW/MMU/MMU.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,4 +263,6 @@ namespace MMU
263263
uint16 ReadMMIO_32(PAddr address);
264264
uint16 ReadMMIO_16(PAddr address);
265265

266-
}
266+
}
267+
268+
#define MMU_IsInPPCMemorySpace(__ptr) ((const uint8*)(__ptr) >= memory_base && (const uint8*)(__ptr) < (memory_base + 0x100000000))

src/Cafe/OS/libs/coreinit/coreinit_Alarm.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,7 @@ namespace coreinit
211211

212212
void __OSInitiateAlarm(OSAlarm_t* alarm, uint64 startTime, uint64 period, MPTR handlerFunc, bool isPeriodic)
213213
{
214+
cemu_assert_debug(MMU_IsInPPCMemorySpace(alarm));
214215
cemu_assert_debug(__OSHasSchedulerLock());
215216

216217
uint64 nextTime = startTime;

src/Cafe/OS/libs/coreinit/coreinit_MEM.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ namespace coreinit
5050
MEMList g_list3;
5151

5252
std::array<uint32, 3> gHeapFillValues{ 0xC3C3C3C3, 0xF3F3F3F3, 0xD3D3D3D3 };
53-
OSSpinLock gHeapGlobalLock;
53+
SysAllocator<OSSpinLock> gHeapGlobalLock;
5454
MEMHeapBase* gDefaultHeap;
5555

5656
bool MEMHeapTable_Add(MEMHeapBase* heap)

src/Cafe/OS/libs/coreinit/coreinit_Thread.cpp

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -263,9 +263,7 @@ namespace coreinit
263263
thread = (OSThread_t*)memory_getPointerFromVirtualOffset(coreinit_allocFromSysArea(sizeof(OSThread_t), 32));
264264
memset(thread, 0x00, sizeof(OSThread_t));
265265
// init signatures
266-
thread->context.magic0 = OS_CONTEXT_MAGIC_0;
267-
thread->context.magic1 = OS_CONTEXT_MAGIC_1;
268-
thread->magic = 'tHrD';
266+
thread->SetMagic();
269267
thread->type = threadType;
270268
thread->state = (entryPoint != MPTR_NULL) ? OSThread_t::THREAD_STATE::STATE_READY : OSThread_t::THREAD_STATE::STATE_NONE;
271269
thread->entrypoint = _swapEndianU32(entryPoint);
@@ -563,7 +561,10 @@ namespace coreinit
563561
// adds the thread to each core's run queue if in runable state
564562
void __OSAddReadyThreadToRunQueue(OSThread_t* thread)
565563
{
564+
cemu_assert_debug(MMU_IsInPPCMemorySpace(thread));
565+
cemu_assert_debug(thread->IsValidMagic());
566566
cemu_assert_debug(__OSHasSchedulerLock());
567+
567568
if (thread->state != OSThread_t::THREAD_STATE::STATE_READY)
568569
return;
569570
if (thread->suspendCounter != 0)
@@ -703,10 +704,18 @@ namespace coreinit
703704
}
704705
else if (prevAffinityMask != affinityMask)
705706
{
706-
__OSRemoveThreadFromRunQueues(thread);
707-
thread->attr = (thread->attr & ~7) | (affinityMask & 7);
708-
thread->context.setAffinity(affinityMask);
709-
__OSAddReadyThreadToRunQueue(thread);
707+
if(thread->state != OSThread_t::THREAD_STATE::STATE_NONE)
708+
{
709+
__OSRemoveThreadFromRunQueues(thread);
710+
thread->attr = (thread->attr & ~7) | (affinityMask & 7);
711+
thread->context.setAffinity(affinityMask);
712+
__OSAddReadyThreadToRunQueue(thread);
713+
}
714+
else
715+
{
716+
thread->attr = (thread->attr & ~7) | (affinityMask & 7);
717+
thread->context.setAffinity(affinityMask);
718+
}
710719
}
711720
__OSUnlockScheduler();
712721
return true;

src/Cafe/OS/libs/coreinit/coreinit_Thread.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,18 @@ struct OSThread_t
404404
return 0;
405405
}
406406

407+
void SetMagic()
408+
{
409+
context.magic0 = OS_CONTEXT_MAGIC_0;
410+
context.magic1 = OS_CONTEXT_MAGIC_1;
411+
magic = 'tHrD';
412+
}
413+
414+
bool IsValidMagic() const
415+
{
416+
return magic == 'tHrD' && context.magic0 == OS_CONTEXT_MAGIC_0 && context.magic1 == OS_CONTEXT_MAGIC_1;
417+
}
418+
407419
/* +0x000 */ OSContext_t context;
408420
/* +0x320 */ uint32be magic; // 'tHrD'
409421
/* +0x324 */ betype<THREAD_STATE> state;

src/Cafe/OS/libs/erreula/erreula.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ namespace erreula
8282

8383
struct ErrEula_t
8484
{
85-
coreinit::OSMutex mutex;
85+
SysAllocator<coreinit::OSMutex> mutex;
8686
uint32 regionType;
8787
uint32 langType;
8888
MEMPTR<coreinit::FSClient_t> fsClient;

src/Cafe/OS/libs/nn_boss/nn_boss.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ memset(bossRequest, 0, sizeof(iosuBossCemuRequest_t)); \
2323
memset(bossBufferVector, 0, sizeof(ioBufferVector_t)); \
2424
bossBufferVector->buffer = (uint8*)bossRequest;
2525

26-
coreinit::OSMutex g_mutex;
26+
SysAllocator<coreinit::OSMutex> g_mutex;
2727
sint32 g_initCounter = 0;
2828
bool g_isInitialized = false;
2929

src/Cafe/OS/libs/padscore/padscore.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ namespace padscore
5454
WPADState_t g_wpad_state = kWPADStateMaster;
5555

5656
struct {
57-
coreinit::OSAlarm_t alarm;
57+
SysAllocator<coreinit::OSAlarm_t> alarm;
5858
bool kpad_initialized = false;
5959

6060
struct WPADData

src/Cafe/OS/libs/vpad/vpad.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ namespace vpad
163163

164164
struct
165165
{
166-
coreinit::OSAlarm_t alarm;
166+
SysAllocator<coreinit::OSAlarm_t> alarm;
167167

168168
struct
169169
{

0 commit comments

Comments
 (0)