Print chunk misalignment details on fail

This commit is contained in:
meepingsnesroms
2019-04-14 21:05:52 -07:00
parent e1a9162cc9
commit 4c27b1abb1

View File

@@ -417,6 +417,16 @@ static bool installResourceToDevice(buffer_t resourceBuffer){
return true;
}
static void printChunkHeader(uint32_t pointer){
uint32_t address = pointer - 8;
uint32_t headerLong1 = m68k_read_memory_32(address);
uint32_t totalSize = headerLong1 & 0x00FFFFFF;
uint8_t extraBytes = headerLong1 >> 24 & 0x0F;
uint32_t userRequestedSize = totalSize - 8 - extraBytes;
debugLog("Chunk header: address:0x%08X, totalSize:0x%08X, userSize:0x%08X, extraBytes:0x%02X\n", address, totalSize, userRequestedSize, extraBytes);
}
static void checkMemoryAlignmentPointer(uint16_t heap){
uint32_t memPtrs[100];
uint8_t index;
@@ -437,6 +447,7 @@ static void checkMemoryAlignmentPointer(uint16_t heap){
for(index = 0; index < 100; index++){
if(memPtrs[index] & 0x00000003){
debugLog("Memory test: Memory allocations are not 32 bit aligned:0x%08X\n", memPtrs[index]);
printChunkHeader(memPtrs[index]);
goto failed;
}
}
@@ -454,6 +465,7 @@ static void checkMemoryAlignmentPointer(uint16_t heap){
for(index = 0; index < 100; index++){
if(memPtrs[index] & 0x00000003){
debugLog("Memory test: Memory misaligned by defragment:0x%08X\n", memPtrs[index]);
printChunkHeader(memPtrs[index]);
goto failed;
}
}
@@ -507,6 +519,7 @@ static void checkMemoryAlignmentHandle(uint16_t heap){
for(index = 0; index < 100; index++){
if(memPtrs[index] & 0x00000003){
debugLog("Memory test: Memory allocations are not 32 bit aligned:0x%08X\n", memPtrs[index]);
printChunkHeader(memPtrs[index]);
goto failed;
}
}
@@ -538,6 +551,7 @@ static void checkMemoryAlignmentHandle(uint16_t heap){
for(index = 0; index < 100; index++){
if(memPtrs[index] & 0x00000003){
debugLog("Memory test: Memory misaligned by resize:0x%08X\n", memPtrs[index]);
printChunkHeader(memPtrs[index]);
goto failed;
}
}
@@ -567,6 +581,7 @@ static void checkMemoryAlignmentHandle(uint16_t heap){
for(index = 0; index < 100; index++){
if(memPtrs[index] & 0x00000003){
debugLog("Memory test: Memory misaligned by defragment:0x%08X\n", memPtrs[index]);
printChunkHeader(memPtrs[index]);
goto failed;
}
}
@@ -1031,6 +1046,19 @@ uint32_t sandboxCommand(uint32_t command, void* data){
ROM:10021C8C addq.l #1,d5 ; 16 bit align ???
*/
//size extra bits are not being set when chuncks are allocated
//PrvChunkNew derives size extra from total size - requested size, so its already safe, PrvPtrResize does the same
/*
ROM:10020FFA setSizeExtra: ; CODE XREF: PrvChunkNew_10020CBC+312↑j
ROM:10020FFA move.l d3,d0 ; Move Data from Source to Destination
ROM:10020FFC sub.l size(a6),d0 ; Subtract
ROM:10021000 subq.l #8,d0 ; Subtract Quick
ROM:10021002 andi.b #$F,d0 ; AND Immediate
ROM:10021006 andi.b #$F0,(a2) ; AND Immediate
ROM:1002100A or.b d0,(a2) ; Inclusive-OR Logical
*/
//patch PrvChunkNew to 32 bit alignment, this alone does not fix 32 bit alignment issues
patchOsRom(0x20D04, "202E000AC0BCFFFFFFFCB0AE000A6700000458805080544F");//adds an extra 4 bytes if & 0x00000003 is true
//when moving memory around some 16 bit aligned pointers still show up