1*95e33099SBrooks Davis /*-
2*95e33099SBrooks Davis * Copyright (c) 2026 Capabilities Limited
3*95e33099SBrooks Davis *
4*95e33099SBrooks Davis * SPDX-License-Identifier: BSD-2-Clause
5*95e33099SBrooks Davis *
6*95e33099SBrooks Davis * This software was developed by Capabilities Limited with funding from
7*95e33099SBrooks Davis * Innovate UK and the Department for Science, Innovation and Technology
8*95e33099SBrooks Davis * for the adoption and diffusion of CHERI technology under project
9*95e33099SBrooks Davis * 10168042 (“CheriBSD feature extraction, maturity, and testing”).
10*95e33099SBrooks Davis */
11*95e33099SBrooks Davis
12*95e33099SBrooks Davis #include <sys/exterrvar.h>
13*95e33099SBrooks Davis #include <errno.h>
14*95e33099SBrooks Davis #include <exterr.h>
15*95e33099SBrooks Davis #include <string.h>
16*95e33099SBrooks Davis #include "libc_private.h"
17*95e33099SBrooks Davis
18*95e33099SBrooks Davis void
__uexterr_set_ue(struct uexterror * ue,int error,int category,const char * mmsg,uint64ptr_t pp1,uint64ptr_t pp2,int line)19*95e33099SBrooks Davis __uexterr_set_ue(struct uexterror *ue, int error, int category,
20*95e33099SBrooks Davis const char *mmsg, uint64ptr_t pp1, uint64ptr_t pp2, int line)
21*95e33099SBrooks Davis {
22*95e33099SBrooks Davis memset((char *)ue + offsetof(struct uexterror, error), 0,
23*95e33099SBrooks Davis sizeof(struct uexterror) - offsetof(struct uexterror, error));
24*95e33099SBrooks Davis ue->error = error;
25*95e33099SBrooks Davis ue->cat = category | EXTERR_CAT_SRC_USER;
26*95e33099SBrooks Davis ue->src_line = line;
27*95e33099SBrooks Davis ue->p1 = pp1;
28*95e33099SBrooks Davis ue->p2 = pp2;
29*95e33099SBrooks Davis if (mmsg != NULL)
30*95e33099SBrooks Davis strlcpy(ue->msg, mmsg, sizeof(ue->msg));
31*95e33099SBrooks Davis else
32*95e33099SBrooks Davis ue->msg[0] = '\0';
33*95e33099SBrooks Davis errno = error;
34*95e33099SBrooks Davis }
35*95e33099SBrooks Davis
36*95e33099SBrooks Davis void
__libc_uexterr_set(int error,int category,const char * mmsg,uint64ptr_t pp1,uint64ptr_t pp2,int line)37*95e33099SBrooks Davis __libc_uexterr_set(int error, int category, const char *mmsg, uint64ptr_t pp1,
38*95e33099SBrooks Davis uint64ptr_t pp2, int line)
39*95e33099SBrooks Davis {
40*95e33099SBrooks Davis __uexterr_set_ue(&uexterr, error, category, mmsg, pp1, pp2, line);
41*95e33099SBrooks Davis }
42*95e33099SBrooks Davis
43*95e33099SBrooks Davis void
uexterr_set(int error,int category,const char * mmsg,uint64ptr_t pp1,uint64ptr_t pp2,int line)44*95e33099SBrooks Davis uexterr_set(int error, int category, const char *mmsg, uint64ptr_t pp1,
45*95e33099SBrooks Davis uint64ptr_t pp2, int line)
46*95e33099SBrooks Davis {
47*95e33099SBrooks Davis ((void (*)(int, int, const char *, uint64ptr_t, uint64ptr_t, int))
48*95e33099SBrooks Davis __libc_interposing[INTERPOS_uexterr_set])(error, category,
49*95e33099SBrooks Davis mmsg, pp1, pp2, line);
50*95e33099SBrooks Davis }
51