diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2025-10-25 09:14:59 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2025-11-04 04:11:12 +0000 |
| commit | 069e2fb5506f8301cd9e2da1946c718bd268c50c (patch) | |
| tree | 2cfe782579c4b7cdfe48b7812f03bc2be685ad07 | |
| parent | 7746b51dae12b09266d02f02f8d3b772282ddaf1 (diff) | |
exterror(9): add two helpers
The exterr_set_from() function sets current thread extended error from
the pre-filled struct kexterr.
The exterr_clear() function clears some struct kexterr.
Reviewed by: mckusick
Sponsored by: The FreeBSD Foundation
Differential revision: https://reviews.freebsd.org/D53351
| -rw-r--r-- | sys/kern/sys_generic.c | 19 | ||||
| -rw-r--r-- | sys/sys/exterrvar.h | 2 |
2 files changed, 21 insertions, 0 deletions
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 7d666da9f88b..a61341df436c 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -2345,3 +2345,22 @@ exterr_set(int eerror, int category, const char *mmsg, uintptr_t pp1, } return (eerror); } + +int +exterr_set_from(const struct kexterr *ke) +{ + struct thread *td; + + td = curthread; + if ((td->td_pflags2 & TDP2_UEXTERR) != 0) { + td->td_pflags2 |= TDP2_EXTERR; + td->td_kexterr = *ke; + } + return (td->td_kexterr.error); +} + +void +exterr_clear(struct kexterr *ke) +{ + memset(ke, 0, sizeof(*ke)); +} diff --git a/sys/sys/exterrvar.h b/sys/sys/exterrvar.h index 5fce8ae7ffbe..1e07f6afb547 100644 --- a/sys/sys/exterrvar.h +++ b/sys/sys/exterrvar.h @@ -69,6 +69,8 @@ _EXTERROR_MACRO(__VA_ARGS__, _SET_ERROR2, _SET_ERROR1, \ _SET_ERROR0)(__VA_ARGS__) +void exterr_clear(struct kexterr *ke); +int exterr_set_from(const struct kexterr *ke); 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); |
