#elif defined(CPU_x86_64)
/* Parameters are passed in RDI, RSI by default (System V AMD64 ABI). */
#define JITCALL
+#elif defined(CPU_arm) || defined(CPU_AARCH64)
+/* ARM/ARM64: parameters are passed in registers by default. */
+#define JITCALL
#elif defined(HAVE_FUNC_ATTRIBUTE_REGPARM)
/* Parameters are passed in EAX, EDX on x86 with regparm(2). */
#define JITCALL __attribute__((regparm(2)))
#define UAE_VM_32BIT (1 << 8)
#define UAE_VM_WRITE_WATCH (1 << 9)
+#define UAE_VM_JIT (1 << 10)
#define UAE_VM_ALLOC_FAILED NULL
/* Even though it looks like you can OR together vm protection values,
void *uae_vm_alloc(size_t size, int flags, int protect);
bool uae_vm_protect(void *address, size_t size, int protect);
bool uae_vm_free(void *address, size_t size);
+void uae_vm_jit_write_protect(bool enable_execute_mode);
void *uae_vm_reserve(size_t size, int flags);
void *uae_vm_reserve_fixed(void *address, size_t size, int flags);
#endif
#if defined(__APPLE__)
#include <sys/sysctl.h>
+#if defined(CPU_AARCH64)
+#include <pthread.h>
+#endif
#endif
//#if defined(LINUX) && defined(CPU_x86_64)
#else
int mmap_flags = MAP_PRIVATE | MAP_ANON;
int mmap_prot = protect_to_native(protect);
+#if defined(__APPLE__) && defined(CPU_AARCH64)
+ if (flags & UAE_VM_JIT) {
+#ifdef MAP_JIT
+ mmap_flags |= MAP_JIT;
+#else
+ uae_log("VM: UAE_VM_JIT requested but MAP_JIT is unavailable on this SDK\n");
+#endif
+ }
+#endif
#endif
#if !defined(CPU_64_BIT) || defined(__APPLE__)
return do_free(address, size);
}
+void uae_vm_jit_write_protect(bool enable_execute_mode)
+{
+#if defined(__APPLE__) && defined(CPU_AARCH64)
+ pthread_jit_write_protect_np(enable_execute_mode ? 1 : 0);
+#else
+ (void)enable_execute_mode;
+#endif
+}
+
static void *try_reserve(uintptr_t try_addr, size_t size, int flags)
{
void *address = NULL;
}
#else
int mmap_flags = MAP_PRIVATE | MAP_ANON;
+#if defined(__APPLE__) && defined(CPU_AARCH64)
+ if (flags & UAE_VM_JIT) {
+#ifdef MAP_JIT
+ mmap_flags |= MAP_JIT;
+#else
+ uae_log("VM: UAE_VM_JIT reserve requested but MAP_JIT is unavailable on this SDK\n");
+#endif
+ }
+#endif
address = mmap((void *) try_addr, size, PROT_NONE, mmap_flags, -1, 0);
if (address == MAP_FAILED) {
return NULL;