xref: /openbsd-src/lib/libc/gen/elf_aux_info.c (revision ef873df06dac50249b2dd380dc6100eee3b0d23d)
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