From e08299faf41b875ab6a4ddb615178b0a7535436e Mon Sep 17 00:00:00 2001 From: Thilo Schulz Date: Mon, 23 May 2011 00:36:27 +0000 Subject: [PATCH] - Do assignment of value 0xDEADBEEF after the 4-byte alignment - Add all GPR to clobber list as GCC function callAsmCall seems to change register r11 without saving it to stack first, which may result in SIGSEGV in VM_CallCompiled() --- code/qcommon/vm_x86_64.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/code/qcommon/vm_x86_64.c b/code/qcommon/vm_x86_64.c index d3086368..4fc8812e 100644 --- a/code/qcommon/vm_x86_64.c +++ b/code/qcommon/vm_x86_64.c @@ -1029,7 +1029,9 @@ This function is called directly by the generated code static char* memData; #endif -int VM_CallCompiled( vm_t *vm, int *args ) { +int VM_CallCompiled(vm_t *vm, int *args) +{ + int stack[OPSTACK_SIZE + 3]; int programCounter; int programStack; int stackOnEntry; @@ -1037,7 +1039,6 @@ int VM_CallCompiled( vm_t *vm, int *args ) { byte *image; void *entryPoint; int *opStack; - int stack[OPSTACK_SIZE + 3] = { 0xDEADBEEF }; currentVM = vm; @@ -1079,6 +1080,8 @@ int VM_CallCompiled( vm_t *vm, int *args ) { entryPoint = getentrypoint(vm); opStack = PADP(stack, 4); + *opStack = 0xDEADBEEF; + __asm__ __volatile__ ( " movq $0x0,%%rbx \r\n" \ " movl %5,%%edi \r\n" \ @@ -1092,8 +1095,9 @@ int VM_CallCompiled( vm_t *vm, int *args ) { " movq %%rbx, %1 \r\n" \ : "=g" (programStack), "=g" (opStackRet) : "g" (entryPoint), "g" (opStack), "g" (vm->dataBase), "g" (programStack) - : "%rsi", "%rdi", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r15", "%xmm0" + : "%rsi", "%rdi", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", "%xmm0" ); + if(opStackRet != 1 || *opStack != 0xDEADBEEF) Com_Error(ERR_DROP, "opStack corrupted in compiled code (offset %ld)", opStackRet);