Implement memory access bound check with hardware trap for 64-bit platforms (#293)
Also implement native stack overflow check with hardware trap for 64-bit platforms Refine classic interpreter and fast interpreter to improve performance Update document
This commit is contained in:
@ -61,6 +61,15 @@ fail1:
|
||||
void
|
||||
wasm_exec_env_destroy_internal(WASMExecEnv *exec_env)
|
||||
{
|
||||
#ifdef OS_ENABLE_HW_BOUND_CHECK
|
||||
WASMJmpBuf *jmpbuf = exec_env->jmpbuf_stack_top;
|
||||
WASMJmpBuf *jmpbuf_prev;
|
||||
while (jmpbuf) {
|
||||
jmpbuf_prev = jmpbuf->prev;
|
||||
wasm_runtime_free(jmpbuf);
|
||||
jmpbuf = jmpbuf_prev;
|
||||
}
|
||||
#endif
|
||||
#if WASM_ENABLE_THREAD_MGR != 0
|
||||
os_mutex_destroy(&exec_env->wait_lock);
|
||||
os_cond_destroy(&exec_env->wait_cond);
|
||||
@ -121,7 +130,6 @@ wasm_exec_env_set_thread_info(WASMExecEnv *exec_env)
|
||||
exec_env->handle = os_self_thread();
|
||||
exec_env->native_stack_boundary = os_thread_get_stack_boundary()
|
||||
+ RESERVED_BYTES_TO_NATIVE_STACK_BOUNDARY;
|
||||
|
||||
}
|
||||
|
||||
#if WASM_ENABLE_THREAD_MGR != 0
|
||||
@ -136,4 +144,27 @@ wasm_exec_env_set_thread_arg(WASMExecEnv *exec_env, void *thread_arg)
|
||||
{
|
||||
exec_env->thread_arg = thread_arg;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef OS_ENABLE_HW_BOUND_CHECK
|
||||
void
|
||||
wasm_exec_env_push_jmpbuf(WASMExecEnv *exec_env, WASMJmpBuf *jmpbuf)
|
||||
{
|
||||
jmpbuf->prev = exec_env->jmpbuf_stack_top;
|
||||
exec_env->jmpbuf_stack_top = jmpbuf;
|
||||
}
|
||||
|
||||
WASMJmpBuf *
|
||||
wasm_exec_env_pop_jmpbuf(WASMExecEnv *exec_env)
|
||||
{
|
||||
WASMJmpBuf *stack_top = exec_env->jmpbuf_stack_top;
|
||||
|
||||
if (stack_top) {
|
||||
exec_env->jmpbuf_stack_top = stack_top->prev;
|
||||
return stack_top;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@ -22,6 +22,13 @@ struct WASMInterpFrame;
|
||||
typedef struct WASMCluster WASMCluster;
|
||||
#endif
|
||||
|
||||
#ifdef OS_ENABLE_HW_BOUND_CHECK
|
||||
typedef struct WASMJmpBuf {
|
||||
struct WASMJmpBuf *prev;
|
||||
korp_jmpbuf jmpbuf;
|
||||
} WASMJmpBuf;
|
||||
#endif
|
||||
|
||||
/* Execution environment */
|
||||
typedef struct WASMExecEnv {
|
||||
/* Next thread's exec env of a WASM module instance. */
|
||||
@ -82,6 +89,10 @@ typedef struct WASMExecEnv {
|
||||
BlockAddr block_addr_cache[BLOCK_ADDR_CACHE_SIZE][BLOCK_ADDR_CONFLICT_SIZE];
|
||||
#endif
|
||||
|
||||
#ifdef OS_ENABLE_HW_BOUND_CHECK
|
||||
WASMJmpBuf *jmpbuf_stack_top;
|
||||
#endif
|
||||
|
||||
/* The WASM stack size */
|
||||
uint32 wasm_stack_size;
|
||||
|
||||
@ -207,6 +218,14 @@ void
|
||||
wasm_exec_env_set_thread_arg(WASMExecEnv *exec_env, void *thread_arg);
|
||||
#endif
|
||||
|
||||
#ifdef OS_ENABLE_HW_BOUND_CHECK
|
||||
void
|
||||
wasm_exec_env_push_jmpbuf(WASMExecEnv *exec_env, WASMJmpBuf *jmpbuf);
|
||||
|
||||
WASMJmpBuf *
|
||||
wasm_exec_env_pop_jmpbuf(WASMExecEnv *exec_env);
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -120,9 +120,24 @@ wasm_runtime_env_init()
|
||||
goto fail5;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if WASM_ENABLE_AOT != 0
|
||||
#ifdef OS_ENABLE_HW_BOUND_CHECK
|
||||
if (!aot_signal_init()) {
|
||||
goto fail6;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
return true;
|
||||
|
||||
#if WASM_ENABLE_AOT != 0
|
||||
#ifdef OS_ENABLE_HW_BOUND_CHECK
|
||||
fail6:
|
||||
#endif
|
||||
#endif
|
||||
#if WASM_ENABLE_THREAD_MGR != 0
|
||||
thread_manager_destroy();
|
||||
fail5:
|
||||
#endif
|
||||
#if WASM_ENABLE_SHARED_MEMORY
|
||||
@ -170,6 +185,12 @@ wasm_runtime_init()
|
||||
void
|
||||
wasm_runtime_destroy()
|
||||
{
|
||||
#if WASM_ENABLE_AOT != 0
|
||||
#ifdef OS_ENABLE_HW_BOUND_CHECK
|
||||
aot_signal_destroy();
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* runtime env destroy */
|
||||
#if WASM_ENABLE_MULTI_MODULE
|
||||
wasm_runtime_destroy_loading_module_list();
|
||||
|
||||
Reference in New Issue
Block a user