Enable AOT usage on M1 mac (#2618)

This commit is contained in:
Enrico Loparco 2023-10-07 08:05:10 +00:00 committed by GitHub
parent 1ef7c1c83d
commit 3668093053
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 105 additions and 0 deletions

View File

@ -3232,10 +3232,13 @@ aot_load_from_aot_file(const uint8 *buf, uint32 size, char *error_buf,
if (!module) if (!module)
return NULL; return NULL;
os_thread_jit_write_protect_np(false); /* Make memory writable */
if (!load(buf, size, module, error_buf, error_buf_size)) { if (!load(buf, size, module, error_buf, error_buf_size)) {
aot_unload(module); aot_unload(module);
return NULL; return NULL;
} }
os_thread_jit_write_protect_np(true); /* Make memory executable */
os_icache_flush(module->code, module->code_size);
LOG_VERBOSE("Load module success.\n"); LOG_VERBOSE("Load module success.\n");
return module; return module;

View File

@ -53,7 +53,12 @@ get_target_symbol_map(uint32 *sym_num)
return target_sym_map; return target_sym_map;
} }
#if (defined(__APPLE__) || defined(__MACH__)) && defined(__arm64__)
#define BUILD_TARGET_AARCH64_DEFAULT "arm64"
#else
#define BUILD_TARGET_AARCH64_DEFAULT "aarch64v8" #define BUILD_TARGET_AARCH64_DEFAULT "aarch64v8"
#endif
void void
get_current_target(char *target_buf, uint32 target_buf_size) get_current_target(char *target_buf, uint32 target_buf_size)
{ {

View File

@ -69,3 +69,7 @@ os_mprotect(void *addr, size_t size, int prot)
void void
os_dcache_flush() os_dcache_flush()
{} {}
void
os_icache_flush(void *start, size_t len)
{}

View File

@ -359,3 +359,7 @@ os_thread_get_stack_boundary()
/* TODO: get alios stack boundary */ /* TODO: get alios stack boundary */
return NULL; return NULL;
} }
void
os_thread_jit_write_protect_np(bool enabled)
{}

View File

@ -5,6 +5,10 @@
#include "platform_api_vmcore.h" #include "platform_api_vmcore.h"
#if (defined(__APPLE__) || defined(__MACH__)) && defined(__arm64__)
#include <libkern/OSCacheControl.h>
#endif
#ifndef BH_ENABLE_TRACE_MMAP #ifndef BH_ENABLE_TRACE_MMAP
#define BH_ENABLE_TRACE_MMAP 0 #define BH_ENABLE_TRACE_MMAP 0
#endif #endif
@ -36,7 +40,11 @@ void *
os_mmap(void *hint, size_t size, int prot, int flags) os_mmap(void *hint, size_t size, int prot, int flags)
{ {
int map_prot = PROT_NONE; int map_prot = PROT_NONE;
#if (defined(__APPLE__) || defined(__MACH__)) && defined(__arm64__)
int map_flags = MAP_ANONYMOUS | MAP_PRIVATE | MAP_JIT;
#else
int map_flags = MAP_ANONYMOUS | MAP_PRIVATE; int map_flags = MAP_ANONYMOUS | MAP_PRIVATE;
#endif
uint64 request_size, page_size; uint64 request_size, page_size;
uint8 *addr = MAP_FAILED; uint8 *addr = MAP_FAILED;
uint32 i; uint32 i;
@ -251,3 +259,11 @@ os_mprotect(void *addr, size_t size, int prot)
void void
os_dcache_flush(void) os_dcache_flush(void)
{} {}
void
os_icache_flush(void *start, size_t len)
{
#if (defined(__APPLE__) || defined(__MACH__)) && defined(__arm64__)
sys_icache_invalidate(start, len);
#endif
}

View File

@ -418,6 +418,14 @@ os_thread_get_stack_boundary()
return addr; return addr;
} }
void
os_thread_jit_write_protect_np(bool enabled)
{
#if (defined(__APPLE__) || defined(__MACH__)) && defined(__arm64__)
pthread_jit_write_protect_np(enabled);
#endif
}
#ifdef OS_ENABLE_HW_BOUND_CHECK #ifdef OS_ENABLE_HW_BOUND_CHECK
#define SIG_ALT_STACK_SIZE (32 * 1024) #define SIG_ALT_STACK_SIZE (32 * 1024)

View File

@ -100,6 +100,10 @@ void
#endif #endif
} }
void
os_icache_flush(void *start, size_t len)
{}
#if (WASM_MEM_DUAL_BUS_MIRROR != 0) #if (WASM_MEM_DUAL_BUS_MIRROR != 0)
void * void *
os_get_dbus_mirror(void *ibus) os_get_dbus_mirror(void *ibus)

View File

@ -53,6 +53,10 @@ os_thread_get_stack_boundary(void)
#endif #endif
} }
void
os_thread_jit_write_protect_np(bool enabled)
{}
int int
os_usleep(uint32 usec) os_usleep(uint32 usec)
{ {

View File

@ -81,6 +81,13 @@ os_self_thread(void);
uint8 * uint8 *
os_thread_get_stack_boundary(void); os_thread_get_stack_boundary(void);
/**
* Set whether the MAP_JIT region write protection is enabled for this thread.
* Pass true to make the region executable, false to make it writable.
*/
void
os_thread_jit_write_protect_np(bool enabled);
/** /**
************** mutext APIs *********** ************** mutext APIs ***********
* vmcore: Not required until pthread is supported by runtime * vmcore: Not required until pthread is supported by runtime
@ -143,6 +150,12 @@ os_get_dbus_mirror(void *ibus);
void void
os_dcache_flush(void); os_dcache_flush(void);
/**
* Flush instruction cache.
*/
void
os_icache_flush(void *start, size_t len);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -195,3 +195,7 @@ os_mprotect(void *addr, size_t size, int prot)
void void
os_dcache_flush(void) os_dcache_flush(void)
{} {}
void
os_icache_flush(void *start, size_t len)
{}

View File

@ -210,3 +210,7 @@ os_thread_get_stack_boundary()
/* TODO: get sgx stack boundary */ /* TODO: get sgx stack boundary */
return NULL; return NULL;
} }
void
os_thread_jit_write_protect_np(bool enabled)
{}

View File

@ -144,6 +144,10 @@ os_dcache_flush()
bus_sync(); bus_sync();
} }
void
os_icache_flush(void *start, size_t len)
{}
#if (WASM_MEM_DUAL_BUS_MIRROR != 0) #if (WASM_MEM_DUAL_BUS_MIRROR != 0)
void * void *
os_get_dbus_mirror(void *ibus) os_get_dbus_mirror(void *ibus)

View File

@ -79,3 +79,7 @@ os_dcache_flush(void)
irq_unlock(key); irq_unlock(key);
#endif #endif
} }
void
os_icache_flush(void *start, size_t len)
{}

View File

@ -430,3 +430,7 @@ os_thread_get_stack_boundary()
return NULL; return NULL;
#endif #endif
} }
void
os_thread_jit_write_protect_np(bool enabled)
{}

View File

@ -140,6 +140,10 @@ os_thread_get_stack_boundary(void)
return tid->stack_addr; return tid->stack_addr;
} }
void
os_thread_jit_write_protect_np(bool enabled)
{}
int int
os_mutex_init(korp_mutex *mutex) os_mutex_init(korp_mutex *mutex)
{ {
@ -207,3 +211,7 @@ os_mprotect(void *addr, size_t size, int prot)
void void
os_dcache_flush(void) os_dcache_flush(void)
{} {}
void
os_icache_flush(void *start, size_t len)
{}

View File

@ -73,3 +73,7 @@ os_getpagesize()
void void
os_dcache_flush(void) os_dcache_flush(void)
{} {}
void
os_icache_flush(void *start, size_t len)
{}

View File

@ -712,6 +712,10 @@ os_thread_get_stack_boundary()
return thread_stack_boundary; return thread_stack_boundary;
} }
void
os_thread_jit_write_protect_np(bool enabled)
{}
#ifdef OS_ENABLE_HW_BOUND_CHECK #ifdef OS_ENABLE_HW_BOUND_CHECK
static os_thread_local_attribute bool thread_signal_inited = false; static os_thread_local_attribute bool thread_signal_inited = false;

View File

@ -214,6 +214,10 @@ os_dcache_flush()
#endif #endif
} }
void
os_icache_flush(void *start, size_t len)
{}
void void
set_exec_mem_alloc_func(exec_mem_alloc_func_t alloc_func, set_exec_mem_alloc_func(exec_mem_alloc_func_t alloc_func,
exec_mem_free_func_t free_func) exec_mem_free_func_t free_func)

View File

@ -574,3 +574,7 @@ os_thread_get_stack_boundary()
return NULL; return NULL;
#endif #endif
} }
void
os_thread_jit_write_protect_np(bool enabled)
{}