[Scummvm-cvs-logs] SF.net SVN: scummvm:[54312] scummvm/trunk/backends/platform/psp

Bluddy at users.sourceforge.net Bluddy at users.sourceforge.net
Thu Nov 18 08:52:04 CET 2010


Revision: 54312
          http://scummvm.svn.sourceforge.net/scummvm/?rev=54312&view=rev
Author:   Bluddy
Date:     2010-11-18 07:52:04 +0000 (Thu, 18 Nov 2010)

Log Message:
-----------
PSP: added backtracing function for debugging

Currently not used by anything.

Modified Paths:
--------------
    scummvm/trunk/backends/platform/psp/trace.cpp
    scummvm/trunk/backends/platform/psp/trace.h

Modified: scummvm/trunk/backends/platform/psp/trace.cpp
===================================================================
--- scummvm/trunk/backends/platform/psp/trace.cpp	2010-11-18 07:17:53 UTC (rev 54311)
+++ scummvm/trunk/backends/platform/psp/trace.cpp	2010-11-18 07:52:04 UTC (rev 54312)
@@ -28,6 +28,8 @@
 #include <pspdebug.h>
 #include <stdarg.h>
 #include <stdio.h>
+#define FORBIDDEN_SYMBOL_ALLOW_ALL
+#include "common/scummsys.h"
 
 int psp_debug_indent = 0;
 bool firstWriteToFile = true;
@@ -58,3 +60,82 @@
 	if (alsoToScreen)
 		fprintf(stderr, buffer);
 }
+
+// Assembly functions to get the Return Address register and the Stack pointer register
+#define GET_RET(retAddr) \
+	asm volatile ("move %0,$ra\n\t"	\
+		 : "=&r" (retAddr) : )
+		 
+#define GET_SP(stackPtr) \
+	asm volatile ("move %0,$sp\n\t"	\
+		 : "=&r" (stackPtr) : )
+
+// Function to retrieve a backtrace for the MIPS processor
+// This is not trivial since the MIPS doesn't use a frame pointer. 
+// Takes the number of levels wanted above the calling function (included) and an array of void *
+//		 
+void mipsBacktrace(uint32 levels, void **addresses) {
+	// get the current return address	
+	register byte *retAddr;
+	register byte *stackPointer;
+	GET_RET(retAddr);	
+	GET_SP(stackPointer);
+	char string[100];
+	
+	if (!levels)
+		return;
+	
+	memset(addresses, 0, sizeof(void *) * levels);
+	
+	uint32 curLevel = 0;
+	
+	const uint32 SP_SUBTRACT = 0x27bd8000;		// The instruction to subtract from the SP looks like this
+	const uint32 SP_SUB_HIGH_MASK = 0xffff8000;	// The mask to check for the subtract SP instruction
+	const uint32 SP_SUB_LOW_MASK = 0x0000ffff;	// The mask that gives us how much was subtracted
+	
+	// make sure we go out of the stack of this current level
+	// we already have the return address for this level from the register
+	if (curLevel < levels) {
+		void *thisFunc = (void *)mipsBacktrace;		
+		for (uint32 *seekPtr = (uint32 *)thisFunc; ; seekPtr++) {
+			if ((*seekPtr & SP_SUB_HIGH_MASK) == SP_SUBTRACT) {
+				// we found the $sp subtraction at the beginning of the function
+				int16 subAmount = (int16)((*seekPtr) & SP_SUB_LOW_MASK);
+				//sprintf(string, "found local $sp sub at %p. Data[%x]. Sub amount %d\n", seekPtr, *seekPtr, subAmount);
+				//fputs(string, stderr);
+				stackPointer -= subAmount;
+				byte *testRetAddr = (byte *)*((uint32 *)(stackPointer - 4));
+				if (testRetAddr != retAddr) {
+					sprintf(string, "mismatch in testretAddr.\n");
+					fputs(string, stderr);
+				}
+				break;
+			}	
+		}		
+	}
+	
+	// keep scanning while more levels are requested
+	while (curLevel < levels) {
+		// now scan backwards from the return address to find the size of the stack
+		for(uint32 *seekPtr = (uint32 *)retAddr; ; seekPtr--) {
+			if (((*seekPtr) & SP_SUB_HIGH_MASK) == SP_SUBTRACT) {
+				// we found the $sp subtraction at the beginning of the function
+				int16 subAmount = (int16)((*seekPtr) & SP_SUB_LOW_MASK);
+				//sprintf(string, "found $sp sub at %p. Data[%x]. Sub amount %d\n", seekPtr, *seekPtr, subAmount);
+				//fputs(string, stderr);
+				stackPointer -= subAmount;
+				retAddr = (byte *)*((uint32 *)(stackPointer - 4));
+				if (retAddr < (byte *)0x8900000 || retAddr > (byte *)0xC900000) {
+					sprintf(string, "invalid retAddr %p\n", retAddr);
+					fputs(string, stderr);
+					return;
+				}	
+				//sprintf(string, "retAddr[%p]\n", retAddr);
+				//fputs(string, stderr);
+				addresses[curLevel++] = retAddr;
+				break;
+			}	
+		}	
+	}
+}		 
+

Modified: scummvm/trunk/backends/platform/psp/trace.h
===================================================================
--- scummvm/trunk/backends/platform/psp/trace.h	2010-11-18 07:17:53 UTC (rev 54311)
+++ scummvm/trunk/backends/platform/psp/trace.h	2010-11-18 07:52:04 UTC (rev 54312)
@@ -55,6 +55,7 @@
 												__PSP_PRINT__(format, ## __VA_ARGS__); }
 
 void PspDebugTrace(bool alsoToScreen, const char *format, ...);
+void mipsBacktrace(uint32 levels, void **addresses);
 
 extern int psp_debug_indent;
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list