diff --git a/src/boot/boot.c b/src/boot/boot.c index 7b8b4f4ff..dc6dad418 100644 --- a/src/boot/boot.c +++ b/src/boot/boot.c @@ -999,12 +999,12 @@ glabel func000016cc .L000017f8: /* 17f8: 0c00058d */ jal func00001634 /* 17fc: 2405001f */ addiu $a1,$zero,0x1f -/* 1800: 3c048006 */ lui $a0,%hi(var8005ce10) -/* 1804: 3c038006 */ lui $v1,%hi(var8005ce2c) -/* 1808: 3c028006 */ lui $v0,%hi(var8005ce48) -/* 180c: 2442ce48 */ addiu $v0,$v0,%lo(var8005ce48) -/* 1810: 2463ce2c */ addiu $v1,$v1,%lo(var8005ce2c) -/* 1814: 2484ce10 */ addiu $a0,$a0,%lo(var8005ce10) +/* 1800: 3c048006 */ lui $a0,%hi(g_StackStartAddrs) +/* 1804: 3c038006 */ lui $v1,%hi(g_StackEndAddrs) +/* 1808: 3c028006 */ lui $v0,%hi(g_StackAllocatedPos) +/* 180c: 2442ce48 */ addiu $v0,$v0,%lo(g_StackAllocatedPos) +/* 1810: 2463ce2c */ addiu $v1,$v1,%lo(g_StackEndAddrs) +/* 1814: 2484ce10 */ addiu $a0,$a0,%lo(g_StackStartAddrs) .L00001818: /* 1818: 24630004 */ addiu $v1,$v1,0x4 /* 181c: 24840004 */ addiu $a0,$a0,0x4 @@ -1162,22 +1162,22 @@ glabel func000016cc #if VERSION >= VERSION_NTSC_1_0 GLOBAL_ASM( glabel allocateStack -/* 18ac: 3c098006 */ lui $t1,%hi(var8005ce48) -/* 18b0: 2529ce48 */ addiu $t1,$t1,%lo(var8005ce48) +/* 18ac: 3c098006 */ lui $t1,%hi(g_StackAllocatedPos) +/* 18b0: 2529ce48 */ addiu $t1,$t1,%lo(g_StackAllocatedPos) /* 18b4: 8d230000 */ lw $v1,0x0($t1) /* 18b8: 00041080 */ sll $v0,$a0,0x2 -/* 18bc: 3c018006 */ lui $at,%hi(var8005ce2c) +/* 18bc: 3c018006 */ lui $at,%hi(g_StackEndAddrs) /* 18c0: 00220821 */ addu $at,$at,$v0 -/* 18c4: ac23ce2c */ sw $v1,%lo(var8005ce2c)($at) +/* 18c4: ac23ce2c */ sw $v1,%lo(g_StackEndAddrs)($at) /* 18c8: 2401fff0 */ addiu $at,$zero,-16 /* 18cc: 24a5000f */ addiu $a1,$a1,0xf /* 18d0: 00a17024 */ and $t6,$a1,$at -/* 18d4: 3c018006 */ lui $at,%hi(var8005ce10) +/* 18d4: 3c018006 */ lui $at,%hi(g_StackStartAddrs) /* 18d8: 006e7823 */ subu $t7,$v1,$t6 /* 18dc: ad2f0000 */ sw $t7,0x0($t1) /* 18e0: 00220821 */ addu $at,$at,$v0 /* 18e4: 01c02825 */ or $a1,$t6,$zero -/* 18e8: ac2fce10 */ sw $t7,%lo(var8005ce10)($at) +/* 18e8: ac2fce10 */ sw $t7,%lo(g_StackStartAddrs)($at) /* 18ec: 01e01825 */ or $v1,$t7,$zero /* 18f0: 19c0000d */ blez $t6,.L00001928 /* 18f4: 00004025 */ or $t0,$zero,$zero @@ -1192,13 +1192,63 @@ glabel allocateStack /* 1914: 24420001 */ addiu $v0,$v0,0x1 /* 1918: 1505fffd */ bne $t0,$a1,.L00001910 /* 191c: a046ffff */ sb $a2,-0x1($v0) -/* 1920: 3c038006 */ lui $v1,%hi(var8005ce48) -/* 1924: 8c63ce48 */ lw $v1,%lo(var8005ce48)($v1) +/* 1920: 3c038006 */ lui $v1,%hi(g_StackAllocatedPos) +/* 1924: 8c63ce48 */ lw $v1,%lo(g_StackAllocatedPos)($v1) .L00001928: /* 1928: 00651021 */ addu $v0,$v1,$a1 /* 192c: 03e00008 */ jr $ra /* 1930: 2442fff8 */ addiu $v0,$v0,-8 ); + +/** + * Allocate stack space for the given thread ID. + * + * Each allocation is aligned to 16 bytes. + * + * Allocations start from the end of onboard memory (0x80400000) and are + * allocated right to left. + * + * The returned address leaves 8 bytes free on the right side of the stack, + * presumably for identification purposes. So the actual stack space available + * can be 8 bytes above or below what was requested. + * + * The stack is initialised with the thread's ID. This makes it easier to + * identify in memory and detect when a stack overflow has occurred. + */ +// Mismatch: +// i is stored in a3 but should be t0 +// The value written to ptr[i] is stored in t0 but should be a2 +//void *allocateStack(s32 threadid, s32 size) +//{ +// u8 *ptr8; +// u32 *ptr32; +// s32 i; +// s32 j; +// +// g_StackEndAddrs[threadid] = g_StackAllocatedPos; +// size = (size + 0xf) & 0xfffffff0; +// +// g_StackAllocatedPos -= size; +// g_StackStartAddrs[threadid] = g_StackAllocatedPos; +// +// ptr8 = g_StackStartAddrs[threadid]; +// +// for (i = 0; i < size; i++) { +// ptr8[i] = ((0xf - (threadid & 0xf)) << 4) | (threadid & 0xf); +// } +// +//#if VERSION == VERSION_NTSC_BETA +// // Mark the first 8 words specially +// ptr32 = (u32 *)g_StackStartAddrs[threadid]; +// +// for (j = 0; j < 8; j++) { +// *ptr32 = 0xdeadbabe; +// ptr32++; +// } +//#endif +// +// return g_StackAllocatedPos + size - 8; +//} #else GLOBAL_ASM( glabel allocateStack diff --git a/src/game/data/data_000000.c b/src/game/data/data_000000.c index d75e5e0c6..20b76da38 100644 --- a/src/game/data/data_000000.c +++ b/src/game/data/data_000000.c @@ -2972,21 +2972,9 @@ u32 var8005ce00 = 0x00000000; u32 var8005ce04 = 0x00000000; u32 var8005ce08 = 0x00000000; u32 var8005ce0c = 0x00000000; -u32 var8005ce10 = 0x00000000; -u32 var8005ce14 = 0x00000000; -u32 var8005ce18 = 0x00000000; -u32 var8005ce1c = 0x00000000; -u32 var8005ce20 = 0x00000000; -u32 var8005ce24 = 0x00000000; -u32 var8005ce28 = 0x00000000; -u32 var8005ce2c = 0x00000000; -u32 var8005ce30 = 0x00000000; -u32 var8005ce34 = 0x00000000; -u32 var8005ce38 = 0x00000000; -u32 var8005ce3c = 0x00000000; -u32 var8005ce40 = 0x00000000; -u32 var8005ce44 = 0x00000000; -u32 var8005ce48 = 0x80400000; +u8 *g_StackStartAddrs[7] = {0}; +u8 *g_StackEndAddrs[7] = {0}; +u8 *g_StackAllocatedPos = (u8 *)0x80400000; u32 var8005ce4c = 0x00000002; u32 var8005ce50 = 0x10000000; u32 var8005ce54 = 0x00000000; diff --git a/src/include/game/data/data_000000.h b/src/include/game/data/data_000000.h index c48df6eb2..099cf2c65 100644 --- a/src/include/game/data/data_000000.h +++ b/src/include/game/data/data_000000.h @@ -40,9 +40,9 @@ extern s32 g_AlarmTimer; // counts upwards extern u32 var80059fe0; extern u32 var8005a0b0; extern u32 var8005b4d0; -extern u32 var8005ce10; -extern u32 var8005ce2c; -extern u32 var8005ce48; +extern u8 *g_StackStartAddrs[]; +extern u8 *g_StackEndAddrs[]; +extern u8 *g_StackAllocatedPos; extern u32 var8005ce74; extern u32 var8005ce8c; extern u32 var8005ce90; diff --git a/src/lib/lib_0c000.c b/src/lib/lib_0c000.c index d3e6c170e..eaae2a868 100644 --- a/src/lib/lib_0c000.c +++ b/src/lib/lib_0c000.c @@ -365,15 +365,15 @@ glabel func0000c2b8 /* c2e0: 10000010 */ b .L0000c324 /* c2e4: 00001025 */ or $v0,$zero,$zero .L0000c2e8: -/* c2e8: 3c048006 */ lui $a0,%hi(var8005ce10) -/* c2ec: 3c038006 */ lui $v1,%hi(var8005ce2c) +/* c2e8: 3c048006 */ lui $a0,%hi(g_StackStartAddrs) +/* c2ec: 3c038006 */ lui $v1,%hi(g_StackEndAddrs) /* c2f0: 3c018000 */ lui $at,0x8000 /* c2f4: 00822021 */ addu $a0,$a0,$v0 /* c2f8: 00621821 */ addu $v1,$v1,$v0 /* c2fc: 00c1082b */ sltu $at,$a2,$at -/* c300: 8c84ce10 */ lw $a0,%lo(var8005ce10)($a0) +/* c300: 8c84ce10 */ lw $a0,%lo(g_StackStartAddrs)($a0) /* c304: 14200003 */ bnez $at,.L0000c314 -/* c308: 8c63ce2c */ lw $v1,%lo(var8005ce2c)($v1) +/* c308: 8c63ce2c */ lw $v1,%lo(g_StackEndAddrs)($v1) /* c30c: 10000005 */ b .L0000c324 /* c310: 00601025 */ or $v0,$v1,$zero .L0000c314: @@ -403,12 +403,12 @@ glabel func0000c334 /* c358: 1000000b */ b .L0000c388 /* c35c: 00001025 */ or $v0,$zero,$zero .L0000c360: -/* c360: 3c038006 */ lui $v1,%hi(var8005ce10) +/* c360: 3c038006 */ lui $v1,%hi(g_StackStartAddrs) /* c364: 3c018000 */ lui $at,0x8000 /* c368: 006e1821 */ addu $v1,$v1,$t6 /* c36c: 0081082b */ sltu $at,$a0,$at /* c370: 14200003 */ bnez $at,.L0000c380 -/* c374: 8c63ce10 */ lw $v1,%lo(var8005ce10)($v1) +/* c374: 8c63ce10 */ lw $v1,%lo(g_StackStartAddrs)($v1) /* c378: 10000003 */ b .L0000c388 /* c37c: 00601025 */ or $v0,$v1,$zero .L0000c380: