|
@@ -425,6 +425,7 @@ os_thread_get_stack_boundary()
|
|
|
*/
|
|
*/
|
|
|
static os_thread_local_attribute bool thread_signal_inited = false;
|
|
static os_thread_local_attribute bool thread_signal_inited = false;
|
|
|
|
|
|
|
|
|
|
+#if WASM_DISABLE_STACK_HW_BOUND_CHECK == 0
|
|
|
/* The signal alternate stack base addr */
|
|
/* The signal alternate stack base addr */
|
|
|
static os_thread_local_attribute uint8 *sigalt_stack_base_addr;
|
|
static os_thread_local_attribute uint8 *sigalt_stack_base_addr;
|
|
|
|
|
|
|
@@ -488,6 +489,7 @@ destroy_stack_guard_pages()
|
|
|
os_mprotect(stack_min_addr, page_size * guard_page_count,
|
|
os_mprotect(stack_min_addr, page_size * guard_page_count,
|
|
|
MMAP_PROT_READ | MMAP_PROT_WRITE);
|
|
MMAP_PROT_READ | MMAP_PROT_WRITE);
|
|
|
}
|
|
}
|
|
|
|
|
+#endif /* end of WASM_DISABLE_STACK_HW_BOUND_CHECK == 0 */
|
|
|
|
|
|
|
|
static void
|
|
static void
|
|
|
mask_signals(int how)
|
|
mask_signals(int how)
|
|
@@ -553,13 +555,16 @@ int
|
|
|
os_thread_signal_init(os_signal_handler handler)
|
|
os_thread_signal_init(os_signal_handler handler)
|
|
|
{
|
|
{
|
|
|
struct sigaction sig_act;
|
|
struct sigaction sig_act;
|
|
|
|
|
+#if WASM_DISABLE_STACK_HW_BOUND_CHECK == 0
|
|
|
stack_t sigalt_stack_info;
|
|
stack_t sigalt_stack_info;
|
|
|
uint32 map_size = SIG_ALT_STACK_SIZE;
|
|
uint32 map_size = SIG_ALT_STACK_SIZE;
|
|
|
uint8 *map_addr;
|
|
uint8 *map_addr;
|
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
if (thread_signal_inited)
|
|
if (thread_signal_inited)
|
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
+#if WASM_DISABLE_STACK_HW_BOUND_CHECK == 0
|
|
|
if (!init_stack_guard_pages()) {
|
|
if (!init_stack_guard_pages()) {
|
|
|
os_printf("Failed to init stack guard pages\n");
|
|
os_printf("Failed to init stack guard pages\n");
|
|
|
return -1;
|
|
return -1;
|
|
@@ -581,13 +586,17 @@ os_thread_signal_init(os_signal_handler handler)
|
|
|
os_printf("Failed to init signal alternate stack\n");
|
|
os_printf("Failed to init signal alternate stack\n");
|
|
|
goto fail2;
|
|
goto fail2;
|
|
|
}
|
|
}
|
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
memset(&prev_sig_act_SIGSEGV, 0, sizeof(struct sigaction));
|
|
memset(&prev_sig_act_SIGSEGV, 0, sizeof(struct sigaction));
|
|
|
memset(&prev_sig_act_SIGBUS, 0, sizeof(struct sigaction));
|
|
memset(&prev_sig_act_SIGBUS, 0, sizeof(struct sigaction));
|
|
|
|
|
|
|
|
/* Install signal hanlder */
|
|
/* Install signal hanlder */
|
|
|
sig_act.sa_sigaction = signal_callback;
|
|
sig_act.sa_sigaction = signal_callback;
|
|
|
- sig_act.sa_flags = SA_SIGINFO | SA_ONSTACK | SA_NODEFER;
|
|
|
|
|
|
|
+ sig_act.sa_flags = SA_SIGINFO | SA_NODEFER;
|
|
|
|
|
+#if WASM_DISABLE_STACK_HW_BOUND_CHECK == 0
|
|
|
|
|
+ sig_act.sa_flags |= SA_ONSTACK;
|
|
|
|
|
+#endif
|
|
|
sigemptyset(&sig_act.sa_mask);
|
|
sigemptyset(&sig_act.sa_mask);
|
|
|
if (sigaction(SIGSEGV, &sig_act, &prev_sig_act_SIGSEGV) != 0
|
|
if (sigaction(SIGSEGV, &sig_act, &prev_sig_act_SIGSEGV) != 0
|
|
|
|| sigaction(SIGBUS, &sig_act, &prev_sig_act_SIGBUS) != 0) {
|
|
|| sigaction(SIGBUS, &sig_act, &prev_sig_act_SIGBUS) != 0) {
|
|
@@ -595,12 +604,15 @@ os_thread_signal_init(os_signal_handler handler)
|
|
|
goto fail3;
|
|
goto fail3;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+#if WASM_DISABLE_STACK_HW_BOUND_CHECK == 0
|
|
|
sigalt_stack_base_addr = map_addr;
|
|
sigalt_stack_base_addr = map_addr;
|
|
|
|
|
+#endif
|
|
|
signal_handler = handler;
|
|
signal_handler = handler;
|
|
|
thread_signal_inited = true;
|
|
thread_signal_inited = true;
|
|
|
return 0;
|
|
return 0;
|
|
|
|
|
|
|
|
fail3:
|
|
fail3:
|
|
|
|
|
+#if WASM_DISABLE_STACK_HW_BOUND_CHECK == 0
|
|
|
memset(&sigalt_stack_info, 0, sizeof(stack_t));
|
|
memset(&sigalt_stack_info, 0, sizeof(stack_t));
|
|
|
sigalt_stack_info.ss_flags = SS_DISABLE;
|
|
sigalt_stack_info.ss_flags = SS_DISABLE;
|
|
|
sigalt_stack_info.ss_size = map_size;
|
|
sigalt_stack_info.ss_size = map_size;
|
|
@@ -609,17 +621,21 @@ fail2:
|
|
|
os_munmap(map_addr, map_size);
|
|
os_munmap(map_addr, map_size);
|
|
|
fail1:
|
|
fail1:
|
|
|
destroy_stack_guard_pages();
|
|
destroy_stack_guard_pages();
|
|
|
|
|
+#endif
|
|
|
return -1;
|
|
return -1;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
void
|
|
void
|
|
|
os_thread_signal_destroy()
|
|
os_thread_signal_destroy()
|
|
|
{
|
|
{
|
|
|
|
|
+#if WASM_DISABLE_STACK_HW_BOUND_CHECK == 0
|
|
|
stack_t sigalt_stack_info;
|
|
stack_t sigalt_stack_info;
|
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
if (!thread_signal_inited)
|
|
if (!thread_signal_inited)
|
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
|
|
+#if WASM_DISABLE_STACK_HW_BOUND_CHECK == 0
|
|
|
/* Disable signal alternate stack */
|
|
/* Disable signal alternate stack */
|
|
|
memset(&sigalt_stack_info, 0, sizeof(stack_t));
|
|
memset(&sigalt_stack_info, 0, sizeof(stack_t));
|
|
|
sigalt_stack_info.ss_flags = SS_DISABLE;
|
|
sigalt_stack_info.ss_flags = SS_DISABLE;
|
|
@@ -629,6 +645,7 @@ os_thread_signal_destroy()
|
|
|
os_munmap(sigalt_stack_base_addr, SIG_ALT_STACK_SIZE);
|
|
os_munmap(sigalt_stack_base_addr, SIG_ALT_STACK_SIZE);
|
|
|
|
|
|
|
|
destroy_stack_guard_pages();
|
|
destroy_stack_guard_pages();
|
|
|
|
|
+#endif
|
|
|
|
|
|
|
|
thread_signal_inited = false;
|
|
thread_signal_inited = false;
|
|
|
}
|
|
}
|
|
@@ -648,6 +665,7 @@ os_signal_unmask()
|
|
|
void
|
|
void
|
|
|
os_sigreturn()
|
|
os_sigreturn()
|
|
|
{
|
|
{
|
|
|
|
|
+#if WASM_DISABLE_STACK_HW_BOUND_CHECK == 0
|
|
|
#if defined(__APPLE__)
|
|
#if defined(__APPLE__)
|
|
|
#define UC_RESET_ALT_STACK 0x80000000
|
|
#define UC_RESET_ALT_STACK 0x80000000
|
|
|
extern int __sigreturn(void *, int);
|
|
extern int __sigreturn(void *, int);
|
|
@@ -656,5 +674,6 @@ os_sigreturn()
|
|
|
after exiting the signal handler. */
|
|
after exiting the signal handler. */
|
|
|
__sigreturn(NULL, UC_RESET_ALT_STACK);
|
|
__sigreturn(NULL, UC_RESET_ALT_STACK);
|
|
|
#endif
|
|
#endif
|
|
|
|
|
+#endif
|
|
|
}
|
|
}
|
|
|
#endif /* end of OS_ENABLE_HW_BOUND_CHECK */
|
|
#endif /* end of OS_ENABLE_HW_BOUND_CHECK */
|