[quake3-commits] r2385 - trunk/code/qcommon

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sat Dec 15 16:55:07 EST 2012


Author: ztm
Date: 2012-12-15 16:55:07 -0500 (Sat, 15 Dec 2012)
New Revision: 2385

Modified:
   trunk/code/qcommon/vm.c
   trunk/code/qcommon/vm_interpreted.c
   trunk/code/qcommon/vm_local.h
   trunk/code/qcommon/vm_powerpc.c
   trunk/code/qcommon/vm_sparc.c
   trunk/code/qcommon/vm_x86.c
   trunk/code/qcommon/vm_x86_64.c
Log:
Fix passing arg9 (qvm only), arg10, and arg11 to vmMain for native libs and non-i386 compiled or interpated qvms. (Currently they aren't use in vmMain in game, cgame, or ui.)
Fix passing args[11] to args[15] from vm to engine on ppc64 and sparc64. Some of the args are used by game bot prediction syscalls. May have been causing bugs. Note: This was fixed for x86_64 in r2163.

Modified: trunk/code/qcommon/vm.c
===================================================================
--- trunk/code/qcommon/vm.c	2012-12-15 08:08:46 UTC (rev 2384)
+++ trunk/code/qcommon/vm.c	2012-12-15 21:55:07 UTC (rev 2385)
@@ -338,7 +338,7 @@
 intptr_t QDECL VM_DllSyscall( intptr_t arg, ... ) {
 #if !id386 || defined __clang__
   // rcg010206 - see commentary above
-  intptr_t args[16];
+  intptr_t args[MAX_VMSYSCALL_ARGS];
   int i;
   va_list ap;
   
@@ -823,7 +823,7 @@
 	// if we have a dll loaded, call it directly
 	if ( vm->entryPoint ) {
 		//rcg010207 -  see dissertation at top of VM_DllSyscall() in this file.
-		int args[10];
+		int args[MAX_VMMAIN_ARGS-1];
 		va_list ap;
 		va_start(ap, callnum);
 		for (i = 0; i < ARRAY_LEN(args); i++) {
@@ -833,7 +833,7 @@
 
 		r = vm->entryPoint( callnum,  args[0],  args[1],  args[2], args[3],
                             args[4],  args[5],  args[6], args[7],
-                            args[8],  args[9]);
+                            args[8],  args[9], args[10], args[11]);
 	} else {
 #if ( id386 || idsparc ) && !defined __clang__ // calling convention doesn't need conversion in some cases
 #ifndef NO_VM_COMPILED
@@ -845,7 +845,7 @@
 #else
 		struct {
 			int callnum;
-			int args[10];
+			int args[MAX_VMMAIN_ARGS-1];
 		} a;
 		va_list ap;
 

Modified: trunk/code/qcommon/vm_interpreted.c
===================================================================
--- trunk/code/qcommon/vm_interpreted.c	2012-12-15 08:08:46 UTC (rev 2384)
+++ trunk/code/qcommon/vm_interpreted.c	2012-12-15 21:55:07 UTC (rev 2385)
@@ -326,6 +326,7 @@
 	int		*codeImage;
 	int		v1;
 	int		dataMask;
+	int		arg;
 #ifdef DEBUG_VM
 	vmSymbol_t	*profileSymbol;
 #endif
@@ -349,18 +350,11 @@
 	
 	programCounter = 0;
 
-	programStack -= 48;
+	programStack -= ( 8 + 4 * MAX_VMMAIN_ARGS );
 
-	*(int *)&image[ programStack + 44] = args[9];
-	*(int *)&image[ programStack + 40] = args[8];
-	*(int *)&image[ programStack + 36] = args[7];
-	*(int *)&image[ programStack + 32] = args[6];
-	*(int *)&image[ programStack + 28] = args[5];
-	*(int *)&image[ programStack + 24] = args[4];
-	*(int *)&image[ programStack + 20] = args[3];
-	*(int *)&image[ programStack + 16] = args[2];
-	*(int *)&image[ programStack + 12] = args[1];
-	*(int *)&image[ programStack + 8 ] = args[0];
+	for ( arg = 0; arg < MAX_VMMAIN_ARGS; arg++ )
+		*(int *)&image[ programStack + 8 + arg * 4 ] = args[ arg ];
+
 	*(int *)&image[ programStack + 4 ] = 0;	// return stack
 	*(int *)&image[ programStack ] = -1;	// will terminate the loop on return
 
@@ -508,10 +502,10 @@
 					// the vm has ints on the stack, we expect
 					// pointers so we might have to convert it
 					if (sizeof(intptr_t) != sizeof(int)) {
-						intptr_t argarr[16];
-						int *imagePtr = (int *)&image[programStack];
+						intptr_t argarr[ MAX_VMSYSCALL_ARGS ];
+						int *imagePtr = (int *)&image[ programStack ];
 						int i;
-						for (i = 0; i < 16; ++i) {
+						for (i = 0; i < ARRAY_LEN(argarr); ++i) {
 							argarr[i] = *(++imagePtr);
 						}
 						r = vm->systemCall( argarr );

Modified: trunk/code/qcommon/vm_local.h
===================================================================
--- trunk/code/qcommon/vm_local.h	2012-12-15 08:08:46 UTC (rev 2384)
+++ trunk/code/qcommon/vm_local.h	2012-12-15 21:55:07 UTC (rev 2385)
@@ -22,6 +22,14 @@
 #include "q_shared.h"
 #include "qcommon.h"
 
+// Max number of arguments to pass from engine to vm's vmMain function.
+// command number + 12 arguments
+#define MAX_VMMAIN_ARGS 13
+
+// Max number of arguments to pass from a vm to engine's syscall handler function for the vm.
+// syscall number + 15 arguments
+#define MAX_VMSYSCALL_ARGS 16
+
 // don't change, this is hardcoded into x86 VMs, opStack protection relies
 // on this
 #define	OPSTACK_SIZE	1024

Modified: trunk/code/qcommon/vm_powerpc.c
===================================================================
--- trunk/code/qcommon/vm_powerpc.c	2012-12-15 08:08:46 UTC (rev 2384)
+++ trunk/code/qcommon/vm_powerpc.c	2012-12-15 21:55:07 UTC (rev 2385)
@@ -367,13 +367,13 @@
 
 		ret = currentVM->systemCall( argPosition );
 	} else {
-		intptr_t args[11];
+		intptr_t args[MAX_VMSYSCALL_ARGS];
 
 		// generated code does not invert syscall number
 		args[0] = -1 - callSyscallInvNum;
 
 		int *argPosition = (int *)((byte *)currentVM->dataBase + callProgramStack + 4);
-		for( i = 1; i < 11; i++ )
+		for( i = 1; i < ARRAY_LEN(args); i++ )
 			args[ i ] = argPosition[ i ];
 
 		ret = currentVM->systemCall( args );
@@ -2105,9 +2105,9 @@
 
 	vm->currentlyInterpreting = qtrue;
 
-	programStack -= 48;
+	programStack -= ( 8 + 4 * MAX_VMMAIN_ARGS );
 	argPointer = (int *)&image[ programStack + 8 ];
-	memcpy( argPointer, args, 4 * 9 );
+	memcpy( argPointer, args, 4 * MAX_VMMAIN_ARGS );
 	argPointer[ -1 ] = 0;
 	argPointer[ -2 ] = -1;
 

Modified: trunk/code/qcommon/vm_sparc.c
===================================================================
--- trunk/code/qcommon/vm_sparc.c	2012-12-15 08:08:46 UTC (rev 2384)
+++ trunk/code/qcommon/vm_sparc.c	2012-12-15 21:55:07 UTC (rev 2385)
@@ -808,11 +808,11 @@
 		argPosition[0] = -1 - call;
 		ret = currentVM->systemCall(argPosition);
 	} else {
-		intptr_t args[11];
+		intptr_t args[MAX_VMSYSCALL_ARGS];
 
 		args[0] = -1 - call;
 		int *argPosition = (int *)((byte *)currentVM->dataBase + pstack + 4);
-		for( i = 1; i < 11; i++ )
+		for( i = 1; i < ARRAY_LEN(args); i++ )
 			args[i] = argPosition[i];
 
 		ret = currentVM->systemCall(args);
@@ -1650,9 +1650,9 @@
 
 	vm->currentlyInterpreting = qtrue;
 
-	programStack -= 48;
+	programStack -= ( 8 + 4 * MAX_VMMAIN_ARGS );
 	argPointer = (int *)&image[ programStack + 8 ];
-	memcpy( argPointer, args, 4 * 9 );
+	memcpy( argPointer, args, 4 * MAX_VMMAIN_ARGS );
 	argPointer[-1] = 0;
 	argPointer[-2] = -1;
 

Modified: trunk/code/qcommon/vm_x86.c
===================================================================
--- trunk/code/qcommon/vm_x86.c	2012-12-15 08:08:46 UTC (rev 2384)
+++ trunk/code/qcommon/vm_x86.c	2012-12-15 21:55:07 UTC (rev 2385)
@@ -416,7 +416,7 @@
 		int *data;
 #if idx64
 		int index;
-		intptr_t args[16];
+		intptr_t args[MAX_VMSYSCALL_ARGS];
 #endif
 		
 		data = (int *) (savedVM->dataBase + vm_programStack + 4);
@@ -1714,6 +1714,7 @@
 	byte	*image;
 	int	*opStack;
 	int		opStackOfs;
+	int		arg;
 
 	currentVM = vm;
 
@@ -1726,18 +1727,11 @@
 	// set up the stack frame 
 	image = vm->dataBase;
 
-	programStack -= 48;
+	programStack -= ( 8 + 4 * MAX_VMMAIN_ARGS );
 
-	*(int *)&image[ programStack + 44] = args[9];
-	*(int *)&image[ programStack + 40] = args[8];
-	*(int *)&image[ programStack + 36] = args[7];
-	*(int *)&image[ programStack + 32] = args[6];
-	*(int *)&image[ programStack + 28] = args[5];
-	*(int *)&image[ programStack + 24] = args[4];
-	*(int *)&image[ programStack + 20] = args[3];
-	*(int *)&image[ programStack + 16] = args[2];
-	*(int *)&image[ programStack + 12] = args[1];
-	*(int *)&image[ programStack + 8 ] = args[0];
+	for ( arg = 0; arg < MAX_VMMAIN_ARGS; arg++ )
+		*(int *)&image[ programStack + 8 + arg * 4 ] = args[ arg ];
+
 	*(int *)&image[ programStack + 4 ] = 0;	// return stack
 	*(int *)&image[ programStack ] = -1;	// will terminate the loop on return
 
@@ -1799,7 +1793,7 @@
 	{
 		Com_Error(ERR_DROP, "opStack corrupted in compiled code");
 	}
-	if(programStack != stackOnEntry - 48)
+	if(programStack != stackOnEntry - (8 + 4 * MAX_VMMAIN_ARGS))
 		Com_Error(ERR_DROP, "programStack corrupted in compiled code");
 
 	vm->programStack = stackOnEntry;

Modified: trunk/code/qcommon/vm_x86_64.c
===================================================================
--- trunk/code/qcommon/vm_x86_64.c	2012-12-15 08:08:46 UTC (rev 2384)
+++ trunk/code/qcommon/vm_x86_64.c	2012-12-15 21:55:07 UTC (rev 2385)
@@ -86,8 +86,8 @@
 {
 	vm_t *savedVM;
 	intptr_t ret = 0x77;
-	intptr_t args[16];
-//	int iargs[16];
+	intptr_t args[MAX_VMSYSCALL_ARGS];
+//	int iargs[MAX_VMSYSCALL_ARGS];
 	int i;
 
 //	Dfprintf(stderr, "callAsmCall(%ld, %ld)\n", callProgramStack, callSyscallNum);
@@ -1024,6 +1024,7 @@
 	byte	*image;
 	void	*entryPoint;
 	int	*opStack;
+	int		arg;
 
 	currentVM = vm;
 	
@@ -1046,18 +1047,11 @@
 
 	programCounter = 0;
 
-	programStack -= 48;
+	programStack -= ( 8 + 4 * MAX_VMMAIN_ARGS );
 
-	*(int *)&image[ programStack + 44] = args[9];
-	*(int *)&image[ programStack + 40] = args[8];
-	*(int *)&image[ programStack + 36] = args[7];
-	*(int *)&image[ programStack + 32] = args[6];
-	*(int *)&image[ programStack + 28] = args[5];
-	*(int *)&image[ programStack + 24] = args[4];
-	*(int *)&image[ programStack + 20] = args[3];
-	*(int *)&image[ programStack + 16] = args[2];
-	*(int *)&image[ programStack + 12] = args[1];
-	*(int *)&image[ programStack + 8 ] = args[0];
+	for ( arg = 0; arg < MAX_VMMAIN_ARGS; arg++ )
+		*(int *)&image[ programStack + 8 + arg * 4 ] = args[ arg ];
+
 	*(int *)&image[ programStack + 4 ] = 0x77777777;	// return stack
 	*(int *)&image[ programStack ] = -1;	// will terminate the loop on return
 
@@ -1091,7 +1085,7 @@
 	if(opStackRet != 1 || *opStack != 0xDEADBEEF)
 		Com_Error(ERR_DROP, "opStack corrupted in compiled code (offset %ld)", opStackRet);
 
-	if ( programStack != stackOnEntry - 48 ) {
+	if ( programStack != stackOnEntry - ( 8 + 4 * MAX_VMMAIN_ARGS ) ) {
 		Com_Error( ERR_DROP, "programStack corrupted in compiled code" );
 	}
 



More information about the quake3-commits mailing list