git: bbf95a9b8481 - main - exterror(9): split category into multiple sources
Brooks Davis <[email protected]> Mon, 03 Aug 2026 21:44:05 +0000
| Newsgroups | gmane.os.freebsd.devel.cvs.src |
|---|---|
| Message-ID | <6a710ba5.3cf94.105bbf6b__35873.7244315975$1785793680$gmane$org@gitrepo.freebsd.org> |
The branch main has been updated by brooks: URL: https://cgit.FreeBSD.org/src/commit/?id=bbf95a9b8481e41a99b301e12338e1cda6915a01 commit bbf95a9b8481e41a99b301e12338e1cda6915a01 Author: Brooks Davis <[email protected]> AuthorDate: 2026-08-03 16:48:27 +0000 Commit: Brooks Davis <[email protected]> CommitDate: 2026-08-03 21:43:22 +0000 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 --- lib/libc/gen/uexterr_format.c | 18 +++++++++++++++--- sys/sys/exterr_cat.h | 12 ++++++++++++ 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