aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrooks Davis <brooks@FreeBSD.org>2026-08-03 16:48:27 +0000
committerBrooks Davis <brooks@FreeBSD.org>2026-08-03 21:43:22 +0000
commitbbf95a9b8481e41a99b301e12338e1cda6915a01 (patch)
tree12769f15ecb425f40da2f17ce1ef3bb64031f0b4
parent1c0d2f0b1a98526e4f1f5a051ce6904b4c3164e1 (diff)
exterror(9): split category into multiple sources
The static, global index into an array of strings is simple, cheap, and works for the base kernel, but is unworkable for (potentially third-party) kernel modules or for arbitrary userspace code. Swipe a few of the top bits of category to indicate a source with all-zeros being the current model (EXTERR_CAT_SRC_KERN_STATIC). Add two additional sources EXTERR_CAT_SRC_KERN_DYNAMIC and EXTERR_CAT_SRC_USER with stub implementations. Reviewed by: kib Sponsored by: Innovate UK Differential Revision: https://reviews.freebsd.org/D58236
-rw-r--r--lib/libc/gen/uexterr_format.c18
-rw-r--r--sys/sys/exterr_cat.h12
2 files changed, 27 insertions, 3 deletions
diff --git a/lib/libc/gen/uexterr_format.c b/lib/libc/gen/uexterr_format.c
index 308220adea1f..df93ae1447cd 100644
--- a/lib/libc/gen/uexterr_format.c
+++ b/lib/libc/gen/uexterr_format.c
@@ -25,10 +25,22 @@ static const char * const cat_to_filenames[] = {
static const char *
cat_to_filename(int category)
{
- if (category < 0 || category >= nitems(cat_to_filenames) ||
- cat_to_filenames[category] == NULL)
+ switch (EXTERR_CAT_SRC(category)) {
+ case EXTERR_CAT_SRC_KERN_STATIC:
+ if (category < 0 || category >= nitems(cat_to_filenames) ||
+ cat_to_filenames[category] == NULL)
+ return ("unknown:kern");
+ return (cat_to_filenames[category]);
+
+ case EXTERR_CAT_SRC_KERN_DYNAMIC:
+ return ("unknown:kern");
+
+ case EXTERR_CAT_SRC_USER:
+ return ("unknown:user");
+
+ default:
return ("unknown");
- return (cat_to_filenames[category]);
+ }
}
static const char exterror_verbose_name[] = "EXTERROR_VERBOSE";
diff --git a/sys/sys/exterr_cat.h b/sys/sys/exterr_cat.h
index 637cecdcbcd0..1b56e241023b 100644
--- a/sys/sys/exterr_cat.h
+++ b/sys/sys/exterr_cat.h
@@ -22,6 +22,18 @@
#ifndef _SYS_EXTERR_CAT_H_
#define _SYS_EXTERR_CAT_H_
+#define _EXTERR_CAT_SRC_SHIFT 28
+#define EXTERR_CAT_SRC_MASK (0xf << _EXTERR_CAT_SRC_SHIFT)
+
+#define EXTERR_CAT_SRC_KERN_STATIC (0 << _EXTERR_CAT_SRC_SHIFT)
+#define EXTERR_CAT_SRC_KERN_DYNAMIC (1 << _EXTERR_CAT_SRC_SHIFT)
+#define EXTERR_CAT_SRC_USER (2 << _EXTERR_CAT_SRC_SHIFT)
+
+#define EXTERR_CAT_SRC(c) ((c) & EXTERR_CAT_SRC_MASK)
+#define EXTERR_CAT(c) ((c) & ~EXTERR_CAT_SRC_MASK)
+
+#define EXTERR_CAT_NONE 0
+
#define EXTERR_CAT_MMAP 1
#define EXTERR_CAT_FILEDESC 2
#define EXTERR_KTRACE 3 /* To allow inclusion of this