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