@@ -88,26 +88,26 @@ static void jl_unblock_signal(int sig)
88
88
89
89
static void segv_handler (int sig , siginfo_t * info , void * context )
90
90
{
91
- assert (sig == SIGSEGV );
91
+ assert (sig == SIGSEGV || sig == SIGBUS );
92
92
93
93
#ifdef JULIA_ENABLE_THREADING
94
94
if (info -> si_addr == jl_gc_signal_page ) {
95
- jl_unblock_signal (SIGSEGV );
95
+ jl_unblock_signal (sig );
96
96
jl_gc_signal_wait ();
97
97
return ;
98
98
}
99
99
#endif
100
100
if (jl_in_jl_ || is_addr_on_stack (jl_get_ptls_states (), info -> si_addr )) { // stack overflow, or restarting jl_
101
- jl_unblock_signal (SIGSEGV );
101
+ jl_unblock_signal (sig );
102
102
jl_throw (jl_stackovf_exception );
103
103
}
104
- else if (info -> si_code == SEGV_ACCERR ) { // writing to read-only memory (e.g., mmap)
105
- jl_unblock_signal (SIGSEGV );
104
+ else if (sig == SIGSEGV && info -> si_code == SEGV_ACCERR ) { // writing to read-only memory (e.g., mmap)
105
+ jl_unblock_signal (sig );
106
106
jl_throw (jl_readonlymemory_exception );
107
107
}
108
108
else {
109
109
#ifdef SEGV_EXCEPTION
110
- jl_unblock_signal (SIGSEGV );
110
+ jl_unblock_signal (sig );
111
111
jl_throw (jl_segv_exception );
112
112
#else
113
113
sigdie_handler (sig , info , context );
@@ -125,6 +125,10 @@ static void allocate_segv_handler(void)
125
125
if (sigaction (SIGSEGV , & act , NULL ) < 0 ) {
126
126
jl_errorf ("fatal error: sigaction: %s" , strerror (errno ));
127
127
}
128
+ // On AArch64, stack overflow triggers a SIGBUS
129
+ if (sigaction (SIGBUS , & act , NULL ) < 0 ) {
130
+ jl_errorf ("fatal error: sigaction: %s" , strerror (errno ));
131
+ }
128
132
}
129
133
130
134
static unw_context_t * volatile signal_context ;
@@ -506,9 +510,6 @@ void jl_install_default_signal_handlers(void)
506
510
sigemptyset (& act_die .sa_mask );
507
511
act_die .sa_sigaction = sigdie_handler ;
508
512
act_die .sa_flags = SA_SIGINFO ;
509
- if (sigaction (SIGBUS , & act_die , NULL ) < 0 ) {
510
- jl_errorf ("fatal error: sigaction: %s" , strerror (errno ));
511
- }
512
513
if (sigaction (SIGILL , & act_die , NULL ) < 0 ) {
513
514
jl_errorf ("fatal error: sigaction: %s" , strerror (errno ));
514
515
}
0 commit comments