From 187b4bb7d35c2263e0081ef20382397360bf7611 Mon Sep 17 00:00:00 2001 From: Jeffrey Pfau Date: Sun, 31 Jul 2016 17:14:39 -0700 Subject: [PATCH] POSIX: Use a fixed base for executable memory --- CMakeLists.txt | 2 +- src/arm/dynarec-arm/dynarec-impl.c | 2 +- src/platform/posix/exec-mem.s | 4 ++++ src/platform/posix/memory.c | 11 ++++++++++- 4 files changed, 16 insertions(+), 3 deletions(-) create mode 100644 src/platform/posix/exec-mem.s diff --git a/CMakeLists.txt b/CMakeLists.txt index 3bf33af19..42e83fe76 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -160,7 +160,7 @@ elseif(UNIX) endif() list(APPEND CORE_VFS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/util/vfs/vfs-fd.c ${CMAKE_CURRENT_SOURCE_DIR}/src/util/vfs/vfs-dirent.c) - file(GLOB OS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/posix/*.c) + file(GLOB OS_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/posix/*.[cs]) source_group("POSIX-specific code" FILES ${OS_SRC}) endif() diff --git a/src/arm/dynarec-arm/dynarec-impl.c b/src/arm/dynarec-arm/dynarec-impl.c index b47b7b242..b7dabbe8a 100644 --- a/src/arm/dynarec-arm/dynarec-impl.c +++ b/src/arm/dynarec-arm/dynarec-impl.c @@ -129,7 +129,7 @@ void ARMDynarecRecompileTrace(struct ARMCore* cpu, struct ARMDynarecTrace* trace EMIT(&ctx, PUSH, AL, 0x4030); EMIT(&ctx, MOV, AL, 4, 0); EMIT(&ctx, LDRI, AL, 5, 0, ARM_PC * sizeof(uint32_t)); - struct ARMInstructionInfo info; + __attribute__((aligned(64))) struct ARMInstructionInfo info; while (true) { uint16_t instruction = cpu->memory.load16(cpu, ctx.address, 0); struct ARMDynarecLabel* label = &ctx.labels[(ctx.address - trace->start) >> 1]; diff --git a/src/platform/posix/exec-mem.s b/src/platform/posix/exec-mem.s new file mode 100644 index 000000000..21115a36b --- /dev/null +++ b/src/platform/posix/exec-mem.s @@ -0,0 +1,4 @@ +.section .execmem,"awx",%nobits +.global _execMem +_execMem: +.space 0x800000 diff --git a/src/platform/posix/memory.c b/src/platform/posix/memory.c index 65cdce366..5ac73697d 100644 --- a/src/platform/posix/memory.c +++ b/src/platform/posix/memory.c @@ -7,14 +7,23 @@ #include +extern uint32_t _execMem; +static void* _execMemHead = &_execMem; + void* anonymousMemoryMap(size_t size) { return mmap(0, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANON, -1, 0); } void* executableMemoryMap(size_t size) { - return mmap(0, size, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_PRIVATE | MAP_ANON, -1, 0); + void* out = _execMemHead; + _execMemHead += size / sizeof(_execMemHead); + return out; } void mappedMemoryFree(void* memory, size_t size) { + if (memory < _execMemHead + 0x20000) { + _execMemHead -= size / sizeof(_execMemHead); + return; + } munmap(memory, size); }