X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/3903760236c30e3b5ace7a4eefac3a269d68957c..c6bf4f310a33a9262d455ea4d3f0630b1255e3fe:/libsyscall/wrappers/terminate_with_reason.c diff --git a/libsyscall/wrappers/terminate_with_reason.c b/libsyscall/wrappers/terminate_with_reason.c index 05fdb7848..dd7719b47 100644 --- a/libsyscall/wrappers/terminate_with_reason.c +++ b/libsyscall/wrappers/terminate_with_reason.c @@ -28,38 +28,39 @@ /* System call entry points */ int __terminate_with_payload(int pid, uint32_t reason_namespace, uint64_t reason_code, - void *payload, uint32_t payload_size, const char *reason_string, - uint64_t reason_flags); + void *payload, uint32_t payload_size, const char *reason_string, + uint64_t reason_flags); void __abort_with_payload(uint32_t reason_namespace, uint64_t reason_code, - void *payload, uint32_t payload_size, const char *reason_string, - uint64_t reason_flags); + void *payload, uint32_t payload_size, const char *reason_string, + uint64_t reason_flags); static void abort_with_payload_wrapper_internal(uint32_t reason_namespace, uint64_t reason_code, - void *payload, uint32_t payload_size, const char *reason_string, - uint64_t reason_flags) __attribute__((noreturn)); + void *payload, uint32_t payload_size, const char *reason_string, + uint64_t reason_flags) __attribute__((noreturn, cold)); /* System call wrappers */ int terminate_with_reason(int pid, uint32_t reason_namespace, uint64_t reason_code, - const char *reason_string, uint64_t reason_flags) + const char *reason_string, uint64_t reason_flags) { return __terminate_with_payload(pid, reason_namespace, reason_code, 0, 0, - reason_string, reason_flags); + reason_string, reason_flags); } int terminate_with_payload(int pid, uint32_t reason_namespace, uint64_t reason_code, - void *payload, uint32_t payload_size, - const char *reason_string, uint64_t reason_flags) + void *payload, uint32_t payload_size, + const char *reason_string, uint64_t reason_flags) { return __terminate_with_payload(pid, reason_namespace, reason_code, payload, - payload_size, reason_string, reason_flags); + payload_size, reason_string, reason_flags); } -static void abort_with_payload_wrapper_internal(uint32_t reason_namespace, uint64_t reason_code, - void *payload, uint32_t payload_size, const char *reason_string, - uint64_t reason_flags) +static void +abort_with_payload_wrapper_internal(uint32_t reason_namespace, uint64_t reason_code, + void *payload, uint32_t payload_size, const char *reason_string, + uint64_t reason_flags) { sigset_t unmask_signal; @@ -69,34 +70,27 @@ static void abort_with_payload_wrapper_internal(uint32_t reason_namespace, uint6 sigprocmask(SIG_UNBLOCK, &unmask_signal, NULL); __abort_with_payload(reason_namespace, reason_code, payload, payload_size, - reason_string, reason_flags); + reason_string, reason_flags); - /* If sending a SIGABRT failed, we try to fall back to SIGKILL */ + /* If sending a SIGABRT failed, we fall back to SIGKILL */ terminate_with_payload(getpid(), reason_namespace, reason_code, payload, payload_size, - reason_string, reason_flags); + reason_string, reason_flags | OS_REASON_FLAG_ABORT); - /* Last resort, let's use SIGTRAP (SIGILL on i386) */ - sigemptyset(&unmask_signal); - sigaddset(&unmask_signal, SIGTRAP); - sigaddset(&unmask_signal, SIGILL); - sigprocmask(SIG_UNBLOCK, &unmask_signal, NULL); - - __builtin_trap(); + __builtin_unreachable(); } void abort_with_reason(uint32_t reason_namespace, uint64_t reason_code, const char *reason_string, - uint64_t reason_flags) + uint64_t reason_flags) { abort_with_payload_wrapper_internal(reason_namespace, reason_code, 0, 0, reason_string, reason_flags); } void abort_with_payload(uint32_t reason_namespace, uint64_t reason_code, void *payload, - uint32_t payload_size, const char *reason_string, - uint64_t reason_flags) + uint32_t payload_size, const char *reason_string, + uint64_t reason_flags) { abort_with_payload_wrapper_internal(reason_namespace, reason_code, payload, payload_size, - reason_string, reason_flags); + reason_string, reason_flags); } -