On 6/13/25 15:40, Konstantin Belousov wrote:
The branch main has been updated by kib:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=4e207e3849d47648ced17da16aad39355b99d9b2

commit 4e207e3849d47648ced17da16aad39355b99d9b2
Author:     Konstantin Belousov <k...@freebsd.org>
AuthorDate: 2025-06-13 17:32:50 +0000
Commit:     Konstantin Belousov <k...@freebsd.org>
CommitDate: 2025-06-13 19:39:55 +0000

     exterr: make SET_ERRORX() macros an expression evaluating to the errno
And move the actual td_kexterr fill code into the function, saving some
     text.
Suggested and reviewed by: markj
     Sponsored by:   The FreeBSD Foundation
     Differential revision:  https://reviews.freebsd.org/D50836
---
  sys/kern/sys_generic.c | 20 ++++++++++++++++++++
  sys/sys/exterrvar.h    | 22 +++++++---------------
  2 files changed, 27 insertions(+), 15 deletions(-)

diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c
index ec61d0bdc541..d31ff3b939cc 100644
--- a/sys/kern/sys_generic.c
+++ b/sys/kern/sys_generic.c
@@ -2281,3 +2281,23 @@ sys_exterrctl(struct thread *td, struct exterrctl_args 
*uap)
                return (EINVAL);
        }
  }
+
+int
+exterr_set(int eerror, int category, const char *mmsg, uintptr_t pp1,
+    uintptr_t pp2, int line)
+{
+       struct thread *td;
+
+       td = curthread;
+       if ((td->td_pflags2 & TDP2_UEXTERR) != 0) {
+               td->td_pflags2 |= TDP2_EXTERR;
+               td->td_kexterr.error = eerror;
+               td->td_kexterr.cat = category;
+               td->td_kexterr.msg = mmsg;
+               td->td_kexterr.p1 = pp1;
+               td->td_kexterr.p2 = pp2;
+               td->td_kexterr.src_line = line;
+               ktrexterr(td);
+       }
+       return (eerror);
+}
diff --git a/sys/sys/exterrvar.h b/sys/sys/exterrvar.h
index 4b168446e23b..d3c2c7c92d06 100644
--- a/sys/sys/exterrvar.h
+++ b/sys/sys/exterrvar.h
@@ -31,27 +31,19 @@
  #endif
#ifdef BLOAT_KERNEL_WITH_EXTERR
-#define        SET_ERROR_MSG(mmsg)     _Td->td_kexterr.msg = mmsg
+#define        SET_ERROR_MSG(mmsg)     (mmsg)
  #else
-#define        SET_ERROR_MSG(mmsg)     _Td->td_kexterr.msg = NULL
+#define        SET_ERROR_MSG(mmsg)     NULL
  #endif
-#define SET_ERROR2(eerror, mmsg, pp1, pp2) do { \
-       struct thread *_Td = curthread;                         \
-       if ((_Td->td_pflags2 & TDP2_UEXTERR) != 0) {             \
-               _Td->td_pflags2 |= TDP2_EXTERR;                      \
-               _Td->td_kexterr.error = eerror;                      \
-               _Td->td_kexterr.cat = EXTERR_CATEGORY;               \
-               SET_ERROR_MSG(mmsg);                            \
-               _Td->td_kexterr.p1 = (uintptr_t)pp1;         \
-               _Td->td_kexterr.p2 = (uintptr_t)pp2;         \
-               _Td->td_kexterr.src_line = __LINE__;         \
-               ktrexterr(_Td);                                 \
-       }                                                       \
-} while (0)
+#define        SET_ERROR2(eerror, mmsg, pp1, pp2)                              
\
+       exterr_set(eerror, EXTERR_CATEGORY, SET_ERROR_MSG(mmsg),        \
+           (uintptr_t)(pp1), (uintptr_t)(pp2), __LINE__)
  #define       SET_ERROR0(eerror, mmsg)        SET_ERROR2(eerror, mmsg, 0, 0)
  #define       SET_ERROR1(eerror, mmsg, pp1)   SET_ERROR2(eerror, mmsg, pp1, 0)
+int exterr_set(int eerror, int category, const char *mmsg, uintptr_t pp1,
+    uintptr_t pp2, int line);
  int exterr_to_ue(struct thread *td, struct uexterror *ue);
  void ktrexterr(struct thread *td);

BTW, you could have a single SET_ERROR(eerror, mmsg, ...) wrapper around 
SET_ERRORx
following what is done for CTR() (vs CTRx()).

--
John Baldwin


Reply via email to