xref: /freebsd/include/uexterror.h (revision 95e33099c74d9fc7963968f052b7546ad3040317)
1*95e33099SBrooks Davis /*-
2*95e33099SBrooks Davis  * SPDX-License-Identifier: BSD-2-Clause
3*95e33099SBrooks Davis  *
4*95e33099SBrooks Davis  * Copyright (c) 2025 The FreeBSD Foundation
5*95e33099SBrooks Davis  * Copyright (c) 2026 Capabilities Limited
6*95e33099SBrooks Davis  * All rights reserved.
7*95e33099SBrooks Davis  *
8*95e33099SBrooks Davis  * This software were developed by Konstantin Belousov <kib@FreeBSD.org>
9*95e33099SBrooks Davis  * under sponsorship from the FreeBSD Foundation.
10*95e33099SBrooks Davis  *
11*95e33099SBrooks Davis  * This software was developed by Capabilities Limited with funding from
12*95e33099SBrooks Davis  * Innovate UK and the Department for Science, Innovation and Technology
13*95e33099SBrooks Davis  * for the adoption and diffusion of CHERI technology under project
14*95e33099SBrooks Davis  * 10168042 (“CheriBSD feature extraction, maturity, and testing”).
15*95e33099SBrooks Davis  */
16*95e33099SBrooks Davis 
17*95e33099SBrooks Davis #ifndef _UEXTERROR_H_
18*95e33099SBrooks Davis #define	_UEXTERROR_H_
19*95e33099SBrooks Davis 
20*95e33099SBrooks Davis #include <sys/types.h>
21*95e33099SBrooks Davis #include <sys/linker_set.h>
22*95e33099SBrooks Davis 
23*95e33099SBrooks Davis struct exterr_cat {
24*95e33099SBrooks Davis 	unsigned int	cat;
25*95e33099SBrooks Davis 	const char	*file;
26*95e33099SBrooks Davis };
27*95e33099SBrooks Davis 
28*95e33099SBrooks Davis #ifndef UEXTERR_CATEGORY
29*95e33099SBrooks Davis #error "Specify error category before including uexterror.h"
30*95e33099SBrooks Davis #endif
31*95e33099SBrooks Davis 
32*95e33099SBrooks Davis #ifndef NO_UEXTERR_STRINGS
33*95e33099SBrooks Davis static struct exterr_cat __dynamic_cat = { .file = UEXTERR_CATEGORY };
34*95e33099SBrooks Davis DATA_WSET(exterr_cats, __dynamic_cat);
35*95e33099SBrooks Davis #define	_UEXTERR_CATEGORY						\
36*95e33099SBrooks Davis 	(__dynamic_cat.cat | EXTERR_CAT_SRC_USER)
37*95e33099SBrooks Davis #else
38*95e33099SBrooks Davis #define	_UEXTERR_CATEGORY	(EXTERR_CAT_NONE | EXTERR_CAT_SRC_USER)
39*95e33099SBrooks Davis #endif
40*95e33099SBrooks Davis 
41*95e33099SBrooks Davis 
42*95e33099SBrooks Davis #ifdef NO_UEXTERR_STRINGS
43*95e33099SBrooks Davis #define	SET_ERROR_MSG(mmsg)	NULL
44*95e33099SBrooks Davis #else
45*95e33099SBrooks Davis #define	SET_ERROR_MSG(mmsg)	(mmsg)
46*95e33099SBrooks Davis #endif
47*95e33099SBrooks Davis 
48*95e33099SBrooks Davis #define	_SET_ERROR2(eerror, mmsg, pp1, pp2)				\
49*95e33099SBrooks Davis 	uexterr_set(eerror, _UEXTERR_CATEGORY, SET_ERROR_MSG(mmsg),	\
50*95e33099SBrooks Davis 	    (uint64ptr_t)(pp1), (uint64ptr_t)(pp2), __LINE__)
51*95e33099SBrooks Davis #define	_SET_ERROR0(eerror, mmsg)	_SET_ERROR2(eerror, mmsg, 0, 0)
52*95e33099SBrooks Davis #define	_SET_ERROR1(eerror, mmsg, pp1)	_SET_ERROR2(eerror, mmsg, pp1, 0)
53*95e33099SBrooks Davis 
54*95e33099SBrooks Davis #define	_UEXTERROR_MACRO(eerror, mmsg, _1, _2, NAME, ...)		\
55*95e33099SBrooks Davis 	NAME
56*95e33099SBrooks Davis #define	UEXTERROR(...)							\
57*95e33099SBrooks Davis 	_UEXTERROR_MACRO(__VA_ARGS__, _SET_ERROR2, _SET_ERROR1,		\
58*95e33099SBrooks Davis 	    _SET_ERROR0)(__VA_ARGS__)
59*95e33099SBrooks Davis 
60*95e33099SBrooks Davis __BEGIN_DECLS
61*95e33099SBrooks Davis void uexterr_set(int error, int category, const char *mmsg, uint64ptr_t pp1,
62*95e33099SBrooks Davis     uint64ptr_t pp2, int line);
63*95e33099SBrooks Davis __END_DECLS
64*95e33099SBrooks Davis 
65*95e33099SBrooks Davis #endif
66