1 /* $OpenBSD: elf_aux_info.c,v 1.1 2024/07/14 09:48:48 jca Exp $ */
2
3 /*
4 * Copyright (c) 2024 Jeremie Courreges-Anglas <jca@wxcvbn.org>
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #include <sys/types.h>
20 #include <sys/auxv.h>
21
22 #include <errno.h>
23
24 extern int _pagesize;
25 extern unsigned long _hwcap, _hwcap2;
26 extern int _hwcap_avail, _hwcap2_avail;
27
28 int
elf_aux_info(int request,void * buf,int buflen)29 elf_aux_info(int request, void *buf, int buflen)
30 {
31 int ret = 0;
32
33 if (buflen < 0)
34 return EINVAL;
35
36 switch (request) {
37 case AT_HWCAP:
38 if (buflen != sizeof(unsigned long))
39 ret = EINVAL;
40 else if (!_hwcap_avail)
41 ret = ENOENT;
42 else
43 *(unsigned long *)buf = _hwcap;
44 break;
45 case AT_HWCAP2:
46 if (buflen != sizeof(unsigned long))
47 ret = EINVAL;
48 else if (!_hwcap2_avail)
49 ret = ENOENT;
50 else
51 *(unsigned long *)buf = _hwcap2;
52 break;
53 case AT_PAGESZ:
54 if (buflen != sizeof(int))
55 ret = EINVAL;
56 else if (!_pagesize)
57 ret = ENOENT;
58 else
59 *(int *)buf = _pagesize;
60 break;
61 default:
62 if (request < 0 || request >= AT_COUNT)
63 ret = EINVAL;
64 else
65 ret = ENOENT;
66 break;
67 }
68
69 return ret;
70 }
71