From b9c8a07d4dd932aaa43a4ed4c2fe07ac3d901544 Mon Sep 17 00:00:00 2001 From: Konstantin Belousov Date: Fri, 23 May 2025 08:02:41 +0300 Subject: [PATCH] C runtime: enable extended error reporting from kernel Reviewed by: brooks Sponsored by: The FreeBSD Foundation MFC after: 2 weeks Differential revision: https://reviews.freebsd.org/D50483 --- lib/libc/gen/Makefile.inc | 1 + lib/libc/gen/uexterr_gettext.c | 15 +++++++++++++++ lib/libthr/thread/thr_create.c | 4 ++++ lib/libthr/thread/thr_init.c | 3 +++ lib/libthr/thread/thr_private.h | 3 +++ 5 files changed, 26 insertions(+) create mode 100644 lib/libc/gen/uexterr_gettext.c diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc index 9a223f2f69e..6416effeb56 100644 --- a/lib/libc/gen/Makefile.inc +++ b/lib/libc/gen/Makefile.inc @@ -159,6 +159,7 @@ SRCS+= \ ttyname.c \ ttyslot.c \ ualarm.c \ + uexterr_gettext.c \ ulimit.c \ uname.c \ unvis-compat.c \ diff --git a/lib/libc/gen/uexterr_gettext.c b/lib/libc/gen/uexterr_gettext.c new file mode 100644 index 00000000000..1ee295556a4 --- /dev/null +++ b/lib/libc/gen/uexterr_gettext.c @@ -0,0 +1,15 @@ +#include +#include +#include +#include + +static struct uexterror uexterr = { + .ver = UEXTERROR_VER, +}; + +static void uexterr_ctr(void) __attribute__((constructor)); +static void +uexterr_ctr(void) +{ + exterrctl(EXTERRCTL_ENABLE, 0, &uexterr); +} diff --git a/lib/libthr/thread/thr_create.c b/lib/libthr/thread/thr_create.c index 84bbd36ed28..ba2575d461e 100644 --- a/lib/libthr/thread/thr_create.c +++ b/lib/libthr/thread/thr_create.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include #include @@ -285,6 +286,9 @@ thread_start(struct pthread *curthread) curthread->attr.stacksize_attr; #endif + curthread->uexterr.ver = UEXTERROR_VER; + exterrctl(EXTERRCTL_ENABLE, 0, &curthread->uexterr); + /* Run the current thread's start routine with argument: */ _pthread_exit(curthread->start_routine(curthread->arg)); diff --git a/lib/libthr/thread/thr_init.c b/lib/libthr/thread/thr_init.c index 8855491b91c..aef2281c5f2 100644 --- a/lib/libthr/thread/thr_init.c +++ b/lib/libthr/thread/thr_init.c @@ -433,6 +433,9 @@ init_main_thread(struct pthread *thread) thread->unwind_stackend = _usrstack; #endif + thread->uexterr.ver = UEXTERROR_VER; + exterrctl(EXTERRCTL_ENABLE, EXTERRCTLF_FORCE, &thread->uexterr); + /* Others cleared to zero by thr_alloc() */ } diff --git a/lib/libthr/thread/thr_private.h b/lib/libthr/thread/thr_private.h index dc5be08a076..11afd74eea1 100644 --- a/lib/libthr/thread/thr_private.h +++ b/lib/libthr/thread/thr_private.h @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -576,6 +577,8 @@ struct pthread { /* pthread_set/get_name_np */ char *name; + + struct uexterror uexterr; }; #define THR_SHOULD_GC(thrd) \