diff options
author | Thilo Schulz <arny@ats.s.bawue.de> | 2011-05-16 18:17:01 +0000 |
---|---|---|
committer | Tim Angus <tim@ngus.net> | 2013-01-09 22:29:02 +0000 |
commit | 104c19ddaae1f7a7bac6c254afc2e7adba5688eb (patch) | |
tree | 61360fa36b6d9299662933c0850b69eb867b69df | |
parent | 24d967c48660c3e98ef6d49b757c5ffb3e22f50c (diff) |
- Set default opStack size to 256 - Fix integer wraparound. opStack offset in rbx will always be >= 0
-rw-r--r-- | src/qcommon/vm_local.h | 4 | ||||
-rw-r--r-- | src/qcommon/vm_x86_64.c | 24 |
2 files changed, 15 insertions, 13 deletions
diff --git a/src/qcommon/vm_local.h b/src/qcommon/vm_local.h index 60709054..c3759d51 100644 --- a/src/qcommon/vm_local.h +++ b/src/qcommon/vm_local.h @@ -23,7 +23,9 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "q_shared.h" #include "qcommon.h" -#define OPSTACK_SIZE 1024 +// don't change, this is hardcoded into x86 VMs, opStack protection relies +// on this +#define OPSTACK_SIZE 256 #define OPSTACK_MASK (OPSTACK_SIZE-1) // don't change diff --git a/src/qcommon/vm_x86_64.c b/src/qcommon/vm_x86_64.c index fcdd4657..ce9680e5 100644 --- a/src/qcommon/vm_x86_64.c +++ b/src/qcommon/vm_x86_64.c @@ -71,15 +71,15 @@ static void VM_Destroy_Compiled(vm_t* self); | +- r8 - eax scratch - bl opStack offset - ecx scratch (required for shifts) - edx scratch (required for divisions) - rsi scratch - rdi program frame pointer (programStack) - r8 pointer data (vm->dataBase) - r9 opStack data base (vm->opStack + OPSTACK_SIZE / 2) - r10 start of generated code + eax scratch + rbx/bl opStack offset + ecx scratch (required for shifts) + edx scratch (required for divisions) + rsi scratch + rdi program frame pointer (programStack) + r8 pointer data (vm->dataBase) + r9 opStack data base (opStack) + r10 start of generated code */ @@ -1081,7 +1081,7 @@ int VM_CallCompiled( vm_t *vm, int *args ) { opStack = PADP(stack, 4); __asm__ __volatile__ ( - " movq $-0x80,%%rbx \r\n" \ + " movq $0x0,%%rbx \r\n" \ " movl %5,%%edi \r\n" \ " movq %4,%%r8 \r\n" \ " movq %3,%%r9 \r\n" \ @@ -1092,10 +1092,10 @@ int VM_CallCompiled( vm_t *vm, int *args ) { " movl %%edi, %0 \r\n" \ " movq %%rbx, %1 \r\n" \ : "=g" (programStack), "=g" (opStackRet) - : "g" (entryPoint), "g" (((intptr_t ) opStack) + OPSTACK_SIZE / 2), "g" (vm->dataBase), "g" (programStack) + : "g" (entryPoint), "g" (opStack), "g" (vm->dataBase), "g" (programStack) : "%rsi", "%rdi", "%rax", "%rbx", "%rcx", "%rdx", "%r8", "%r9", "%r10", "%r15", "%xmm0" ); - if(opStackRet != -(OPSTACK_SIZE / 2) + 4 || *opStack != 0xDEADBEEF) + if(opStackRet != 4 || *opStack != 0xDEADBEEF) Com_Error(ERR_DROP, "opStack corrupted in compiled code (offset %ld)", opStackRet); if ( programStack != stackOnEntry - 48 ) { |