pike.git
/
src
/
program.c
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/program.c:1:
/* || This file is part of Pike. For copyright information see COPYRIGHT. || Pike is distributed under GPL, LGPL and MPL. See the file COPYING || for more information.
-
|| $Id: program.c,v 1.
605
2006/
07
/
06
16
:
46
:
13
grubba
Exp $
+
|| $Id: program.c,v 1.
606
2006/
08
/
05
20
:
07
:
50
mast
Exp $
*/ #include "global.h" #include "program.h" #include "object.h" #include "dynamic_buffer.h" #include "pike_types.h" #include "stralloc.h" #include "las.h" #include "lex.h"
pike.git/src/program.c:8200:
#include <sys/mman.h> #endif #ifndef PAGESIZE /* A reasonable default... */ #define PAGESIZE 8192 #endif /* !PAGESIZE */ void make_program_executable(struct program *p) {
-
void *addr;
-
size_t len;
-
+
if (!p->num_program) return; if ((p->event_handler == compat_event_handler) && ((p->num_program * sizeof(p->program[0]) <= (NUM_PROG_EVENTS * sizeof(p->event_handler))))) { /* Only event handlers. */ return; }
-
/* Perform page alignment. */
-
addr = (void *)(((size_t)p->program) & ~(PAGESIZE-1));
-
len = (((char *)(p->program + p->num_program)) - ((char *)addr) +
-
(PAGESIZE - 1)) & ~(PAGESIZE-1);
-
+
#ifdef _WIN32 { DWORD old_prot;
-
VirtualProtect(
addr
,
len
, PAGE_EXECUTE_READWRITE, &old_prot);
+
if (!
VirtualProtect
(
p->program
,
+
p->num_program * sizeof (PIKE_OPCODE_T)
,
+
PAGE_EXECUTE_READWRITE, &old_prot)
)
+
Pike_fatal ("VirtualProtect failed, code %d.\n", GetLastError())
;
} #else /* _WIN32 */
-
+
{
+
/* Perform page alignment. */
+
void *addr = (void *)(((size_t)p->program) & ~(PAGESIZE-1));
+
size_t len = (((char *)(p->program + p->num_program)) - ((char *)addr) +
+
(PAGESIZE - 1)) & ~(PAGESIZE-1);
-
+
#if !defined(HAVE_MMAP) || !defined(MEXEC_USES_MMAP) if (mprotect(addr, len, PROT_EXEC | PROT_READ | PROT_WRITE) < 0) { #if 0 fprintf(stderr, "%p:%d: mprotect(%p, %lu, 0x%04x): errno: %d\n", (void *)p->program, (unsigned long)(p->num_program*sizeof(p->program[0])), addr, len, PROT_EXEC | PROT_READ | PROT_WRITE, errno); #endif /* 0 */ } #endif /* !HAVE_MMAP || !MEXEC_USES_MMAP */
-
+
}
#endif /* _WIN32 */ #ifdef HAVE_SYNC_INSTRUCTION_MEMORY sync_instruction_memory(p->program, p->num_program*sizeof(p->program[0])); #elif defined(FLUSH_INSTRUCTION_CACHE) FLUSH_INSTRUCTION_CACHE(p->program, p->num_program*sizeof(p->program[0])); #endif /* HAVE_SYNC_INSTRUCTION_MEMORY || FLUSH_INSTRUCTION_CACHE */ } #endif