]> git.saurik.com Git - apple/xnu.git/blobdiff - libsyscall/wrappers/terminate_with_reason.c
xnu-6153.81.5.tar.gz
[apple/xnu.git] / libsyscall / wrappers / terminate_with_reason.c
index 05fdb78482b59887d9236fa9fc53671fefb0c994..dd7719b471d1ebd4f5e8911d2c6ba0275e255311 100644 (file)
 
 /* 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);
 }
-