diff options
| author | Robert Mustacchi <rm@fingolfin.org> | 2020-10-22 15:56:51 -0700 |
|---|---|---|
| committer | Robert Mustacchi <rm@fingolfin.org> | 2020-11-17 08:52:10 -0800 |
| commit | 350ffdd54baf880f440ddf9697666e283894ded1 (patch) | |
| tree | 938d79d2ad158d809fa15d80774e56b68056a434 /usr/src/lib/libc/port | |
| parent | 7fdea60d55a95f0e46066fd021c4ef1b1321bafc (diff) | |
| download | illumos-joyent-350ffdd54baf880f440ddf9697666e283894ded1.tar.gz | |
13273 want upanic(2)
Reviewed by: C Fraire <cfraire@me.com>
Reviewed by: Andy Fiddaman <andy@omniosce.org>
Approved by: Gordon Ross <gordon.w.ross@gmail.com>
Diffstat (limited to 'usr/src/lib/libc/port')
| -rw-r--r-- | usr/src/lib/libc/port/mapfile-vers | 5 | ||||
| -rw-r--r-- | usr/src/lib/libc/port/sys/upanic.c | 23 | ||||
| -rw-r--r-- | usr/src/lib/libc/port/threads/assfail.c | 32 |
3 files changed, 37 insertions, 23 deletions
diff --git a/usr/src/lib/libc/port/mapfile-vers b/usr/src/lib/libc/port/mapfile-vers index 0be36d5e6b..6a85e0d37e 100644 --- a/usr/src/lib/libc/port/mapfile-vers +++ b/usr/src/lib/libc/port/mapfile-vers @@ -78,6 +78,11 @@ $if _x86 && _ELF64 $add amd64 $endif +SYMBOL_VERSION ILLUMOS_0.36 { + protected: + upanic; +} ILLUMOS_0.35; + SYMBOL_VERSION ILLUMOS_0.35 { protected: qsort_r; diff --git a/usr/src/lib/libc/port/sys/upanic.c b/usr/src/lib/libc/port/sys/upanic.c new file mode 100644 index 0000000000..2edfe4c4ff --- /dev/null +++ b/usr/src/lib/libc/port/sys/upanic.c @@ -0,0 +1,23 @@ +/* + * This file and its contents are supplied under the terms of the + * Common Development and Distribution License ("CDDL"), version 1.0. + * You may only use this file in accordance with the terms of version + * 1.0 of the CDDL. + * + * A full copy of the text of the CDDL should have accompanied this + * source. A copy of the CDDL is also available via the Internet at + * http://www.illumos.org/license/CDDL. + */ + +/* + * Copyright 2020 Oxide Computer Company + */ + +#include <sys/types.h> +#include <sys/syscall.h> + +void +upanic(const void *buf, size_t len) +{ + (void) syscall(SYS_upanic, buf, len); +} diff --git a/usr/src/lib/libc/port/threads/assfail.c b/usr/src/lib/libc/port/threads/assfail.c index 1c032d8ea7..4af2fc5664 100644 --- a/usr/src/lib/libc/port/threads/assfail.c +++ b/usr/src/lib/libc/port/threads/assfail.c @@ -26,10 +26,12 @@ /* * Copyright (c) 2012, 2014 by Delphix. All rights reserved. * Copyright 2015 Joyent, Inc. + * Copyright 2020 Oxide Computer Company */ #include "lint.h" #include "thr_uberdata.h" +#include <upanic.h> const char *panicstr; ulwp_t *panic_thread; @@ -60,35 +62,19 @@ grab_assert_lock() } static void -Abort(const char *msg) +Abort(const char *msg, size_t buflen) { ulwp_t *self; struct sigaction act; sigset_t sigmask; - lwpid_t lwpid; /* to help with core file debugging */ panicstr = msg; if ((self = __curthread()) != NULL) { panic_thread = self; - lwpid = self->ul_lwpid; - } else { - lwpid = _lwp_self(); } - /* set SIGABRT signal handler to SIG_DFL w/o grabbing any locks */ - (void) memset(&act, 0, sizeof (act)); - act.sa_sigaction = SIG_DFL; - (void) __sigaction(SIGABRT, &act, NULL); - - /* delete SIGABRT from the signal mask */ - (void) sigemptyset(&sigmask); - (void) sigaddset(&sigmask, SIGABRT); - (void) __lwp_sigmask(SIG_UNBLOCK, &sigmask); - - (void) _lwp_kill(lwpid, SIGABRT); /* never returns */ - (void) kill(getpid(), SIGABRT); /* if it does, try harder */ - _exit(127); + upanic(msg, buflen); } /* @@ -117,7 +103,7 @@ common_panic(const char *head, const char *why) if (msg[len1 - 1] != '\n') msg[len1++] = '\n'; (void) __write(2, msg, len1); - Abort(msg); + Abort(msg, sizeof (msg)); } void @@ -246,7 +232,7 @@ lock_error(const mutex_t *mp, const char *who, void *cv, const char *msg) (void) strcat(buf, "\n\n"); (void) __write(2, buf, strlen(buf)); if (udp->uberflags.uf_thread_error_detection >= 2) - Abort(buf); + Abort(buf, sizeof (buf)); assert_thread = NULL; (void) _lwp_mutex_unlock(&assert_lock); if (self != NULL) @@ -335,7 +321,7 @@ rwlock_error(const rwlock_t *rp, const char *who, const char *msg) (void) strcat(buf, "\n\n"); (void) __write(2, buf, strlen(buf)); if (udp->uberflags.uf_thread_error_detection >= 2) - Abort(buf); + Abort(buf, sizeof (buf)); assert_thread = NULL; (void) _lwp_mutex_unlock(&assert_lock); if (self != NULL) @@ -383,7 +369,7 @@ thread_error(const char *msg) (void) strcat(buf, "\n\n"); (void) __write(2, buf, strlen(buf)); if (udp->uberflags.uf_thread_error_detection >= 2) - Abort(buf); + Abort(buf, sizeof (buf)); assert_thread = NULL; (void) _lwp_mutex_unlock(&assert_lock); if (self != NULL) @@ -455,7 +441,7 @@ __assfail(const char *assertion, const char *filename, int line_num) * if (self != NULL) * exit_critical(self); */ - Abort(buf); + Abort(buf, sizeof (buf)); } /* |
