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