xref: /aosp_15_r20/external/musl/src/exit/abort.c (revision c9945492fdd68bbe62686c5b452b4dc1be3f8453)
1*c9945492SAndroid Build Coastguard Worker #include <stdlib.h>
2*c9945492SAndroid Build Coastguard Worker #include <signal.h>
3*c9945492SAndroid Build Coastguard Worker #include "syscall.h"
4*c9945492SAndroid Build Coastguard Worker #include "pthread_impl.h"
5*c9945492SAndroid Build Coastguard Worker #include "atomic.h"
6*c9945492SAndroid Build Coastguard Worker #include "lock.h"
7*c9945492SAndroid Build Coastguard Worker #include "ksigaction.h"
8*c9945492SAndroid Build Coastguard Worker 
abort(void)9*c9945492SAndroid Build Coastguard Worker _Noreturn void abort(void)
10*c9945492SAndroid Build Coastguard Worker {
11*c9945492SAndroid Build Coastguard Worker 	raise(SIGABRT);
12*c9945492SAndroid Build Coastguard Worker 
13*c9945492SAndroid Build Coastguard Worker 	/* If there was a SIGABRT handler installed and it returned, or if
14*c9945492SAndroid Build Coastguard Worker 	 * SIGABRT was blocked or ignored, take an AS-safe lock to prevent
15*c9945492SAndroid Build Coastguard Worker 	 * sigaction from installing a new SIGABRT handler, uninstall any
16*c9945492SAndroid Build Coastguard Worker 	 * handler that may be present, and re-raise the signal to generate
17*c9945492SAndroid Build Coastguard Worker 	 * the default action of abnormal termination. */
18*c9945492SAndroid Build Coastguard Worker 	__block_all_sigs(0);
19*c9945492SAndroid Build Coastguard Worker 	LOCK(__abort_lock);
20*c9945492SAndroid Build Coastguard Worker 	__syscall(SYS_rt_sigaction, SIGABRT,
21*c9945492SAndroid Build Coastguard Worker 		&(struct k_sigaction){.handler = SIG_DFL}, 0, _NSIG/8);
22*c9945492SAndroid Build Coastguard Worker 	__syscall(SYS_tkill, __pthread_self()->tid, SIGABRT);
23*c9945492SAndroid Build Coastguard Worker 	__syscall(SYS_rt_sigprocmask, SIG_UNBLOCK,
24*c9945492SAndroid Build Coastguard Worker 		&(long[_NSIG/(8*sizeof(long))]){1UL<<(SIGABRT-1)}, 0, _NSIG/8);
25*c9945492SAndroid Build Coastguard Worker 
26*c9945492SAndroid Build Coastguard Worker 	/* Beyond this point should be unreachable. */
27*c9945492SAndroid Build Coastguard Worker 	a_crash();
28*c9945492SAndroid Build Coastguard Worker 	raise(SIGKILL);
29*c9945492SAndroid Build Coastguard Worker 	_Exit(127);
30*c9945492SAndroid Build Coastguard Worker }
31