From 5da3420e72083d142352529acc11e1518ff153ba Mon Sep 17 00:00:00 2001 From: Tim Angus Date: Sat, 4 Mar 2006 19:04:50 +0000 Subject: * Merged ioq3-r620 - NX stuff --- src/qcommon/vm_x86_64.c | 48 +++++++++++++++--------------------------------- 1 file changed, 15 insertions(+), 33 deletions(-) (limited to 'src/qcommon/vm_x86_64.c') diff --git a/src/qcommon/vm_x86_64.c b/src/qcommon/vm_x86_64.c index 23f87c30..822c3e1d 100644 --- a/src/qcommon/vm_x86_64.c +++ b/src/qcommon/vm_x86_64.c @@ -40,6 +40,8 @@ static FILE* qdasmout; #define Dfprintf(args...) #endif +static void VM_Destroy_Compiled(vm_t* self); + /* eax scratch @@ -309,10 +311,8 @@ out: static int doas(char* in, char* out, unsigned char** compiledcode) { - char* buf; - char* mem; - size_t size = -1, allocsize; - int ps; + unsigned char* mem; + size_t size = -1; pid_t pid; Com_Printf("running assembler < %s > %s\n", in, out); @@ -359,42 +359,16 @@ static int doas(char* in, char* out, unsigned char** compiledcode) Com_Printf("done\n"); - mem = mmapfile(out, &size); + mem = (unsigned char*)mmapfile(out, &size); if(!mem) { Com_Printf(S_COLOR_RED "can't mmap object file %s: %s\n", out, strerror(errno)); return -1; } - ps = sysconf(_SC_PAGE_SIZE); - if(ps == -1) - { - Com_Printf(S_COLOR_RED "can't determine page size: %s\n", strerror(errno)); - return -1; - } - - --ps; + *compiledcode = mem; - allocsize = (size+ps)&~ps; - buf = Hunk_Alloc(allocsize, h_high); - - buf = (void*)(((unsigned long)buf+ps)&~ps); - - memcpy(buf, mem, size); - - munmap(mem, 0); - - if((*compiledcode = (unsigned char*)buf)) - { - // need to be able to exec code - if(mprotect(buf, allocsize, PROT_READ|PROT_WRITE|PROT_EXEC) == -1) - { - Com_Error(ERR_FATAL, "mprotect failed on %p+%x: %s\n", buf, allocsize, strerror(errno)); - } - return size; - } - - return -1; + return size; } static void block_copy_vm(unsigned dest, unsigned src, unsigned count) @@ -898,6 +872,8 @@ void VM_Compile( vm_t *vm, vmHeader_t *header ) { vm->codeBase = compiledcode; // remember to skip ELF header! vm->codeLength = compiledsize; + + vm->destroy = VM_Destroy_Compiled; entryPoint = getentrypoint(vm); @@ -931,6 +907,12 @@ out: } } + +void VM_Destroy_Compiled(vm_t* self) +{ + munmap(self->codeBase, self->codeLength); +} + /* ============== VM_CallCompiled -- cgit