Index | Thread | Search

From:
Jeremie Courreges-Anglas <jca@wxcvbn.org>
Subject:
Re: arm64 LSE support in userland: introduce elf_aux_info?
To:
Mark Kettenis <mark.kettenis@xs4all.nl>
Cc:
deraadt@openbsd.org, tech@openbsd.org, brad@comstyle.com
Date:
Wed, 10 Jul 2024 18:41:57 +0200

Download raw body.

Thread
On Mon, Jul 08, 2024 at 09:17:23AM +0200, Mark Kettenis wrote:
> > Date: Sun, 7 Jul 2024 17:44:39 +0200
> > From: Jeremie Courreges-Anglas <jca@wxcvbn.org>
> > 
> > On Sun, Jul 07, 2024 at 03:00:55PM +0200, Mark Kettenis wrote:
> > > > Date: Sat, 6 Jul 2024 14:47:28 +0200
> > > > From: Jeremie Courreges-Anglas <jca@wxcvbn.org>
> > > > 
> > > > On Thu, Jul 04, 2024 at 08:14:15AM -0600, Theo de Raadt wrote:
> > > > > In glibc, getauxval(3) is a monster API that keeps growing additional
> > > > > heads and tentacles.  Exporting a tiny version of it to userland is
> > > > > worrying.
> > > > 
> > > > Agreed about getauxval.
> > > 
> > > Not sure what you folks mean with that.  Is the problem that there are
> > > too many AT_xxx constants for which we would not want to add support?
> > > That I do agree with.
> > 
> > Yep.
> > 
> > > So do yout think that adding just the few AT_xxx constants that we
> > > care about would cause too many problems in ports?
> > 
> > (One common pattern visible in ports is to #define some AT_xxx
> > constants (with a hardcoded value copied from Linux headers) if
> > they're not already #defined.)
> > 
> > I fear that detection of the getauxval() symbol may trigger the use of
> > Linux-specific code paths, possibly with no useful/usable fallback in
> > case of an error.  Also, some ports may start to include <linux/*.h>
> > headers along with their use of getauxval().  It would be a shame to
> > implement getauxval() and yet need non-trivial patches in ports.
> > 
> > > > > When the real problem here is a tiny little check to use done only
> > > > > internal to only our libc, and therefore why not use an OpenBSD private
> > > > > interface.
> > > > 
> > > > Indeed we could use a private API for this specific need.  But the
> > > > problem is not just about our libc, ports also want a way to query
> > > > hardware capabilities.  We usually have to patch them to use a
> > > > sysctl(2) or just drop the code that detects such capabilities.
> > > > I feel like implementing elf_aux_info(3) should be considered.  Has
> > > > someone already tried that?  If people don't object, that could be a
> > > > todo entry for c2k24.
> > > 
> > > So elf_aux_info(3) is just getauxval(3) with a somewhat different API.
> > > It is a bit better in the sense that it unambiguously tells you if an
> > > AT_xxx value isn't supported.
> > > 
> > > Are you less worried about us not implementing all the AT_xxx defines
> > > that FreeBSD has?
> > 
> > Yes.  Dumb comparison:
> > 
> >   https://www.man7.org/linux/man-pages/man3/getauxval.3.html 34 defines
> >   https://man.freebsd.org/cgi/man.cgi?elf_aux_info(3) 11 defines
> > 
> > Compare that to the 8 AUX_xxx values handled in our kern/exec_elf.c...
> 
> And perhaps more importantly, FreeBSD doesn't have bad ones like
> AT_SECURE.
> 
> > BTW, we currently always export 0 for AUX_flags.  The comment in
> > exec_elf.h says "processor flags".  Have you considered reusing this
> > for a quick compiler-rt hack?
> 
> AUX_flags would be AT_FLAGS, which is related to e_flags in the ELF
> header.  Solaris used this to mark binaries that (unconditionally) use
> certain instruction set extensions.  I suppose we could use it on
> arm64 but AT_HWCAP and AT_HWCAP2 on Linux and FreeBSD provide more
> flags than we could fit in AT_FLAGS.

Ack, forget my question.  I introduced new AUX_hwcap* requests, that
map to the AT_HWCAP* defines.

> If we go this route we do want the features to align with what Linux
> and FreeBSD use.  I don't think we want to burden porters with
> figuring out what OpenBSD feature bit maps onto what Linux uses.

For the diff below I just used the bits from FreeBSD.  Hopefully they
should be the same as Linux, but I haven't checked yet.

> > > I suspect that there is a much smaller number of ports that support
> > > elf_aux_info(3).
> > 
> > Well, maybe it's a good thing? ;)
> > 
> > More seriously, I've started an amd64 bulk build on a system with a
> > dumb elf_aux_info() that always returns ENOENT.  I should have numbers
> > in 2 days for ports that may automatically pick it up.

That bulk build completed with no fallout, but I doubt that
elf_aux_info() is used much on amd64.

> > There would also be a bunch of other ports where we'd have to add an
> > ugly "|| defined(__OpenBSD__)" chunk to the FreeBSD code path, but at
> > least that's something that could be upstreamed.
> >
> > Feedback from other porters would be welcome.

The diff below introduces elf_aux_info(3).  Manpage and
<machine/elf.h> bits taken from FreeBSD.  I have only tested this
(successfully) on amd64.  I have no arm64 machine at hand, and the
riscv64 ports machines are currently busy with a bulk build.

Mark, as discussed, I'm only setting the Atomics/LSE bit on arm64.
If I didn't mess something up, the regress test should show it.

The main TODO entries:
- arm
- remaining arm64 bits (cpu_sysctl/hwcap refactoring?)
- powerpc

Thoughts?  ok?


Index: lib/libc/Symbols.list
===================================================================
RCS file: /cvs/src/lib/libc/Symbols.list,v
diff -u -p -r1.87 Symbols.list
--- lib/libc/Symbols.list	18 May 2024 05:20:22 -0000	1.87
+++ lib/libc/Symbols.list	10 Jul 2024 16:17:09 -0000
@@ -608,6 +608,7 @@ daemon
 devname
 dirfd
 dirname
+elf_aux_info
 endfsent
 endgrent
 endnetgrent
Index: lib/libc/dlfcn/init.c
===================================================================
RCS file: /cvs/src/lib/libc/dlfcn/init.c,v
diff -u -p -r1.22 init.c
--- lib/libc/dlfcn/init.c	21 Jan 2024 17:18:13 -0000	1.22
+++ lib/libc/dlfcn/init.c	10 Jul 2024 16:17:09 -0000
@@ -49,6 +49,8 @@ char	***_csu_finish(char **_argv, char *
 /* provide definitions for these */
 int	_pagesize = 0;
 struct timekeep	*_timekeep;
+unsigned long	_hwcap, _hwcap2;
+int	_hwcap_avail, _hwcap2_avail;
 
 /*
  * In dynamically linked binaries environ and __progname are overridden by
@@ -96,6 +98,14 @@ _libc_preinit(int argc, char **argv, cha
 		;
 	for (aux = (void *)envp; aux->au_id != AUX_null; aux++) {
 		switch (aux->au_id) {
+		case AUX_hwcap:
+			_hwcap = aux->au_v;
+			_hwcap_avail = 1;
+			break;
+		case AUX_hwcap2:
+			_hwcap2 = aux->au_v;
+			_hwcap2_avail = 1;
+			break;
 		case AUX_pagesz:
 			_pagesize = aux->au_v;
 			break;
Index: lib/libc/gen/Makefile.inc
===================================================================
RCS file: /cvs/src/lib/libc/gen/Makefile.inc,v
diff -u -p -r1.82 Makefile.inc
--- lib/libc/gen/Makefile.inc	2 Sep 2019 21:18:40 -0000	1.82
+++ lib/libc/gen/Makefile.inc	10 Jul 2024 16:17:09 -0000
@@ -6,8 +6,8 @@
 SRCS+=  alarm.c assert.c auth_subr.c authenticate.c \
         basename.c clock.c clock_getcpuclockid.c \
         closedir.c confstr.c ctermid.c ctype_.c \
-        daemon.c devname.c dirfd.c dirname.c disklabel.c err.c \
-        errc.c errx.c errlist.c errno.c exec.c \
+        daemon.c devname.c dirfd.c dirname.c disklabel.c elf_aux_info.c \
+        err.c errc.c errx.c errlist.c errno.c exec.c \
         fdatasync.c fnmatch.c fpclassify.c frexp.c \
         fstab.c ftok.c fts.c ftw.c getbsize.c getcap.c getcwd.c \
         getdomainname.c getgrent.c getgrouplist.c gethostname.c \
@@ -36,7 +36,7 @@ SRCS+=  alarm.c assert.c auth_subr.c aut
 
 MAN+=	__tfork_thread.3 alarm.3 auth_subr.3 authenticate.3 basename.3 clock.3 \
 	clock_getcpuclockid.3 confstr.3 \
-	ctermid.3 daemon.3 devname.3 opendir.3 dirname.3 err.3 \
+	ctermid.3 daemon.3 devname.3 opendir.3 dirname.3 elf_aux_info.3 err.3 \
 	execv.3 fabs.3 fnmatch.3 fpclassify.3 fpgetmask.3 frexp.3 ftok.3 fts_open.3 \
 	ftw.3 getbsize.3 cgetent.3 getcwd.3 getdomainname.3 getdiskbyname.3 \
 	getfsent.3 getgrent.3 getgrouplist.3 gethostname.3 getloadavg.3 \
Index: lib/libc/gen/elf_aux_info.3
===================================================================
RCS file: lib/libc/gen/elf_aux_info.3
diff -N lib/libc/gen/elf_aux_info.3
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libc/gen/elf_aux_info.3	10 Jul 2024 16:17:09 -0000
@@ -0,0 +1,111 @@
+.\"	$OpenBSD$
+.\"
+.\" Origin: FreeBSD auxv.3
+.\"
+.\" Copyright (c) 2019 Ian Lepore <ian@freebsd.org>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\"
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd $Mdocdate$
+.Dt ELF_AUX_INFO 3
+.Os
+.Sh NAME
+.Nm elf_aux_info
+.Nd extract data from the elf auxiliary vector of the current process
+.\" .Sh LIBRARY
+.\" .Lb libc
+.Sh SYNOPSIS
+.In sys/auxv.h
+.Ft int
+.Fn elf_aux_info "int aux" "void *buf" "int buflen"
+.Sh DESCRIPTION
+The
+.Fn elf_aux_info
+function retrieves the auxiliary info vector requested in
+.Va aux .
+The information is stored into the provided buffer if it will fit.
+The following values, defined in
+.In sys/elf_common.h
+can be requested (corresponding buffer sizes are specified in parenthesis):
+.Bl -tag -width AT_OSRELDATE
+.\" .It AT_CANARY
+.\" The canary value for SSP (arbitrary sized buffer, as many bytes are
+.\" returned as it fits into it, rest is zeroed).
+.\" .It AT_EXECPATH
+.\" The path of executed program
+.\" .Dv (MAXPATHLEN).
+.\" This may not be present if the process was initialized by
+.\" .Xr fexecve 2
+.\" and the namecache no longer contains the file's name.
+.It AT_HWCAP
+CPU / hardware feature flags
+.Dv (sizeof(unsigned long)) .
+.It AT_HWCAP2
+CPU / hardware feature flags
+.Dv (sizeof(unsigned long)) .
+.\" .It AT_NCPUS
+.\" Number of CPUs
+.\" .Dv (sizeof(int)).
+.\" .It AT_OSRELDATE
+.\" The
+.\" .Dv OSRELDATE
+.\" of the kernel or jail the program is running on
+.\" .Dv (sizeof(int)).
+.\" .It AT_PAGESIZES
+.\" Vector of page sizes (arbitrary sized buffer, as many elements of the
+.\" .Dv pagesizes
+.\" array are returned as it fits).
+.It AT_PAGESZ
+Page size in bytes
+.Dv (sizeof(int)) .
+.\" .It AT_TIMEKEEP
+.\" Pointer to VDSO timehands (for library internal use,
+.\" .Dv sizeof(void *)).
+.\" .It AT_USRSTACKBASE
+.\" Top of the user stack for main thread.
+.\" .It AT_USRSTACKLIM
+.\" Limit for grow of the user stack for main thread.
+.El
+.Sh RETURN VALUES
+Returns zero on success, or an error number on failure.
+.Sh ERRORS
+.Bl -tag -width Er
+.It Bq Er EINVAL
+An unknown item was requested.
+.It Bq Er EINVAL
+The provided buffer was not the right size for the requested item.
+.It Bq Er ENOENT
+The requested item is not available.
+.El
+.Sh HISTORY
+The
+.Fn elf_aux_info
+function appeared in
+.Fx 12.0
+and was first available in
+.Ox 7.6 .
+.\" .Sh BUGS
+.Sh CAVEATS
+Only a small subset of available auxiliary info vector items are
+accessible with this function.
+.\" Some items require a "right-sized" buffer while others just require a
+.\" "big enough" buffer.
Index: lib/libc/gen/elf_aux_info.c
===================================================================
RCS file: lib/libc/gen/elf_aux_info.c
diff -N lib/libc/gen/elf_aux_info.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libc/gen/elf_aux_info.c	10 Jul 2024 16:17:09 -0000
@@ -0,0 +1,70 @@
+/*	$OpenBSD$	*/
+
+/*
+ * Copyright (c) 2024 Jeremie Courreges-Anglas <jca@wxcvbn.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <sys/types.h>
+#include <sys/auxv.h>
+
+#include <errno.h>
+
+extern int _pagesize;
+extern unsigned long _hwcap, _hwcap2;
+extern int _hwcap_avail, _hwcap2_avail;
+
+int
+elf_aux_info(int request, void *buf, int buflen)
+{
+	int ret = 0;
+
+	if (buflen < 0)
+		return EINVAL;
+
+	switch (request) {
+	case AT_HWCAP:
+		if (buflen != sizeof(unsigned long))
+			ret = EINVAL;
+		else if (!_hwcap_avail)
+			ret = ENOENT;
+		else
+			*(unsigned long *)buf = _hwcap;
+		break;
+	case AT_HWCAP2:
+		if (buflen != sizeof(unsigned long))
+			ret = EINVAL;
+		else if (!_hwcap2_avail)
+			ret = ENOENT;
+		else
+			*(unsigned long *)buf = _hwcap2;
+		break;
+	case AT_PAGESZ:
+		if (buflen != sizeof(int))
+			ret = EINVAL;
+		else if (!_pagesize)
+			ret = ENOENT;
+		else
+			*(int *)buf = _pagesize;
+		break;
+	default:
+		if (request < 0 || request >= AT_COUNT)
+			ret = EINVAL;
+		else
+			ret = ENOENT;
+		break;
+	}
+
+	return ret;
+}
Index: lib/libc/hidden/sys/auxv.h
===================================================================
RCS file: lib/libc/hidden/sys/auxv.h
diff -N lib/libc/hidden/sys/auxv.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ lib/libc/hidden/sys/auxv.h	10 Jul 2024 16:17:09 -0000
@@ -0,0 +1,26 @@
+/*	$OpenBSD$	*/
+
+/*
+ * Copyright (c) 2024 Jeremie Courreges-Anglas <jca@wxcvbn.org>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef _LIBC_SYS_AUXV_H_
+#define _LIBC_SYS_AUXV_H_
+
+#include_next <sys/auxv.h>
+
+PROTO_DEPRECATED(elf_aux_info);
+
+#endif /* !_LIBC_SYS_AUXV_H_ */
Index: regress/lib/libc/Makefile
===================================================================
RCS file: /cvs/src/regress/lib/libc/Makefile,v
diff -u -p -r1.58 Makefile
--- regress/lib/libc/Makefile	31 Aug 2021 09:58:17 -0000	1.58
+++ regress/lib/libc/Makefile	10 Jul 2024 16:17:09 -0000
@@ -5,6 +5,7 @@ SUBDIR+= alloca arc4random-fork atexit
 SUBDIR+= basename
 SUBDIR+= cephes cxa-atexit
 SUBDIR+= db dirname
+#SUBDIR+= elf_aux_info
 SUBDIR+= env explicit_bzero
 SUBDIR+= ffs fmemopen fnmatch fpclassify fread
 SUBDIR+= gcvt getaddrinfo getcap getopt getopt_long glob
Index: sys/arch/alpha/include/elf.h
===================================================================
RCS file: sys/arch/alpha/include/elf.h
diff -N sys/arch/alpha/include/elf.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sys/arch/alpha/include/elf.h	10 Jul 2024 16:17:09 -0000
@@ -0,0 +1,7 @@
+/*	$OpenBSD$	*/
+
+/*
+ * This file is in the public domain.
+ */
+
+/* Nothing for now */
Index: sys/arch/amd64/include/elf.h
===================================================================
RCS file: sys/arch/amd64/include/elf.h
diff -N sys/arch/amd64/include/elf.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sys/arch/amd64/include/elf.h	10 Jul 2024 16:17:09 -0000
@@ -0,0 +1,7 @@
+/*	$OpenBSD$	*/
+
+/*
+ * This file is in the public domain.
+ */
+
+/* Nothing for now */
Index: sys/arch/arm/include/elf.h
===================================================================
RCS file: sys/arch/arm/include/elf.h
diff -N sys/arch/arm/include/elf.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sys/arch/arm/include/elf.h	10 Jul 2024 16:17:09 -0000
@@ -0,0 +1,77 @@
+/*	$OpenBSD$	*/
+
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2001 David E. O'Brien
+ * Copyright (c) 1996-1997 John D. Polstra.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _MACHINE_ELF_H_
+#define	_MACHINE_ELF_H_ 1
+
+/*
+ * ELF definitions for the ARM architecture.
+ */
+
+#ifdef _KERNEL
+# define __HAVE_CPU_HWCAP
+# define __HAVE_CPU_HWCAP2
+extern unsigned long	hwcap, hwcap2;
+#endif /* _KERNEL */
+
+/* Flags passed in AT_HWCAP. */
+#define	HWCAP_SWP		0x00000001	/* Unsupported, never set.    */
+#define	HWCAP_HALF		0x00000002	/* Always set.                */
+#define	HWCAP_THUMB		0x00000004
+#define	HWCAP_26BIT		0x00000008	/* Unsupported, never set.    */
+#define	HWCAP_FAST_MULT		0x00000010	/* Always set.                */
+#define	HWCAP_FPA		0x00000020	/* Unsupported, never set.    */
+#define	HWCAP_VFP		0x00000040
+#define	HWCAP_EDSP		0x00000080	/* Always set for ARMv6+.     */
+#define	HWCAP_JAVA		0x00000100	/* Unsupported, never set.    */
+#define	HWCAP_IWMMXT		0x00000200	/* Unsupported, never set.    */
+#define	HWCAP_CRUNCH		0x00000400	/* Unsupported, never set.    */
+#define	HWCAP_THUMBEE		0x00000800
+#define	HWCAP_NEON		0x00001000
+#define	HWCAP_VFPv3		0x00002000
+#define	HWCAP_VFPv3D16		0x00004000
+#define	HWCAP_TLS		0x00008000	/* Always set for ARMv6+.     */
+#define	HWCAP_VFPv4		0x00010000
+#define	HWCAP_IDIVA		0x00020000
+#define	HWCAP_IDIVT		0x00040000
+#define	HWCAP_VFPD32		0x00080000
+#define	HWCAP_IDIV		(HWCAP_IDIVA | HWCAP_IDIVT)
+#define	HWCAP_LPAE		0x00100000
+#define	HWCAP_EVTSTRM		0x00200000	/* Not implemented yet.       */
+
+/* Flags passed in AT_HWCAP2. */
+#define	HWCAP2_AES		0x00000001
+#define	HWCAP2_PMULL		0x00000002
+#define	HWCAP2_SHA1		0x00000004
+#define	HWCAP2_SHA2		0x00000008
+#define	HWCAP2_CRC32		0x00000010
+
+#endif /* !_MACHINE_ELF_H_ */
Index: sys/arch/arm64/arm64/cpu.c
===================================================================
RCS file: /cvs/src/sys/arch/arm64/arm64/cpu.c,v
diff -u -p -r1.124 cpu.c
--- sys/arch/arm64/arm64/cpu.c	10 Jul 2024 11:01:24 -0000	1.124
+++ sys/arch/arm64/arm64/cpu.c	10 Jul 2024 16:17:09 -0000
@@ -32,6 +32,7 @@
 #include <uvm/uvm.h>
 
 #include <machine/fdt.h>
+#include <machine/elf.h>
 
 #include <dev/ofw/openfirm.h>
 #include <dev/ofw/ofw_clock.h>
@@ -717,6 +718,10 @@ cpu_identify(struct cpu_info *ci)
 		printf("%sAtomic", sep);
 		sep = ",";
 		arm64_has_lse = 1;
+		/*
+		 * XXX should be populated and sanitized like cpu_sysctl() does
+		 */
+		hwcap |= HWCAP_ATOMICS;
 	}
 
 	if (ID_AA64ISAR0_CRC32(id) >= ID_AA64ISAR0_CRC32_BASE) {
Index: sys/arch/arm64/include/elf.h
===================================================================
RCS file: sys/arch/arm64/include/elf.h
diff -N sys/arch/arm64/include/elf.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sys/arch/arm64/include/elf.h	10 Jul 2024 16:17:09 -0000
@@ -0,0 +1,121 @@
+/*-
+ * Copyright (c) 1996-1997 John D. Polstra.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef	_MACHINE_ELF_H_
+#define	_MACHINE_ELF_H_
+
+/*
+ * ELF definitions for the AArch64 architecture.
+ */
+
+#ifdef _KERNEL
+# define __HAVE_CPU_HWCAP
+# define __HAVE_CPU_HWCAP2
+extern unsigned long	hwcap, hwcap2;
+#endif /* _KERNEL */
+
+/* HWCAP */
+#define	HWCAP_FP		0x00000001
+#define	HWCAP_ASIMD		0x00000002
+#define	HWCAP_EVTSTRM		0x00000004
+#define	HWCAP_AES		0x00000008
+#define	HWCAP_PMULL		0x00000010
+#define	HWCAP_SHA1		0x00000020
+#define	HWCAP_SHA2		0x00000040
+#define	HWCAP_CRC32		0x00000080
+#define	HWCAP_ATOMICS		0x00000100
+#define	HWCAP_FPHP		0x00000200
+#define	HWCAP_ASIMDHP		0x00000400
+#define	HWCAP_CPUID		0x00000800
+#define	HWCAP_ASIMDRDM		0x00001000
+#define	HWCAP_JSCVT		0x00002000
+#define	HWCAP_FCMA		0x00004000
+#define	HWCAP_LRCPC		0x00008000
+#define	HWCAP_DCPOP		0x00010000
+#define	HWCAP_SHA3		0x00020000
+#define	HWCAP_SM3		0x00040000
+#define	HWCAP_SM4		0x00080000
+#define	HWCAP_ASIMDDP		0x00100000
+#define	HWCAP_SHA512		0x00200000
+#define	HWCAP_SVE		0x00400000
+#define	HWCAP_ASIMDFHM		0x00800000
+#define	HWCAP_DIT		0x01000000
+#define	HWCAP_USCAT		0x02000000
+#define	HWCAP_ILRCPC		0x04000000
+#define	HWCAP_FLAGM		0x08000000
+#define	HWCAP_SSBS		0x10000000
+#define	HWCAP_SB		0x20000000
+#define	HWCAP_PACA		0x40000000
+#define	HWCAP_PACG		0x80000000
+
+/* HWCAP2 */
+#define	HWCAP2_DCPODP		0x0000000000000001ul
+#define	HWCAP2_SVE2		0x0000000000000002ul
+#define	HWCAP2_SVEAES		0x0000000000000004ul
+#define	HWCAP2_SVEPMULL		0x0000000000000008ul
+#define	HWCAP2_SVEBITPERM	0x0000000000000010ul
+#define	HWCAP2_SVESHA3		0x0000000000000020ul
+#define	HWCAP2_SVESM4		0x0000000000000040ul
+#define	HWCAP2_FLAGM2		0x0000000000000080ul
+#define	HWCAP2_FRINT		0x0000000000000100ul
+#define	HWCAP2_SVEI8MM		0x0000000000000200ul
+#define	HWCAP2_SVEF32MM		0x0000000000000400ul
+#define	HWCAP2_SVEF64MM		0x0000000000000800ul
+#define	HWCAP2_SVEBF16		0x0000000000001000ul
+#define	HWCAP2_I8MM		0x0000000000002000ul
+#define	HWCAP2_BF16		0x0000000000004000ul
+#define	HWCAP2_DGH		0x0000000000008000ul
+#define	HWCAP2_RNG		0x0000000000010000ul
+#define	HWCAP2_BTI		0x0000000000020000ul
+#define	HWCAP2_MTE		0x0000000000040000ul
+#define	HWCAP2_ECV		0x0000000000080000ul
+#define	HWCAP2_AFP		0x0000000000100000ul
+#define	HWCAP2_RPRES		0x0000000000200000ul
+#define	HWCAP2_MTE3		0x0000000000400000ul
+#define	HWCAP2_SME		0x0000000000800000ul
+#define	HWCAP2_SME_I16I64	0x0000000001000000ul
+#define	HWCAP2_SME_F64F64	0x0000000002000000ul
+#define	HWCAP2_SME_I8I32	0x0000000004000000ul
+#define	HWCAP2_SME_F16F32	0x0000000008000000ul
+#define	HWCAP2_SME_B16F32	0x0000000010000000ul
+#define	HWCAP2_SME_F32F32	0x0000000020000000ul
+#define	HWCAP2_SME_FA64		0x0000000040000000ul
+#define	HWCAP2_WFXT		0x0000000080000000ul
+#define	HWCAP2_EBF16		0x0000000100000000ul
+#define	HWCAP2_SVE_EBF16	0x0000000200000000ul
+#define	HWCAP2_CSSC		0x0000000400000000ul
+#define	HWCAP2_RPRFM		0x0000000800000000ul
+#define	HWCAP2_SVE2P1		0x0000001000000000ul
+#define	HWCAP2_SME2		0x0000002000000000ul
+#define	HWCAP2_SME2P1		0x0000004000000000ul
+#define	HWCAP2_SME_I16I32	0x0000008000000000ul
+#define	HWCAP2_SME_BI32I32	0x0000010000000000ul
+#define	HWCAP2_SME_B16B16	0x0000020000000000ul
+#define	HWCAP2_SME_F16F16	0x0000040000000000ul
+#define	HWCAP2_MOPS		0x0000080000000000ul
+#define	HWCAP2_HBC		0x0000100000000000ul
+
+#endif /* !_MACHINE_ELF_H_ */
Index: sys/arch/hppa/include/elf.h
===================================================================
RCS file: sys/arch/hppa/include/elf.h
diff -N sys/arch/hppa/include/elf.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sys/arch/hppa/include/elf.h	10 Jul 2024 16:17:09 -0000
@@ -0,0 +1,7 @@
+/*	$OpenBSD$	*/
+
+/*
+ * This file is in the public domain.
+ */
+
+/* Nothing for now */
Index: sys/arch/i386/include/elf.h
===================================================================
RCS file: sys/arch/i386/include/elf.h
diff -N sys/arch/i386/include/elf.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sys/arch/i386/include/elf.h	10 Jul 2024 16:17:09 -0000
@@ -0,0 +1,7 @@
+/*	$OpenBSD$	*/
+
+/*
+ * This file is in the public domain.
+ */
+
+/* Nothing for now */
Index: sys/arch/m88k/include/elf.h
===================================================================
RCS file: sys/arch/m88k/include/elf.h
diff -N sys/arch/m88k/include/elf.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sys/arch/m88k/include/elf.h	10 Jul 2024 16:17:09 -0000
@@ -0,0 +1,7 @@
+/*	$OpenBSD$	*/
+
+/*
+ * This file is in the public domain.
+ */
+
+/* Nothing for now */
Index: sys/arch/mips64/include/elf.h
===================================================================
RCS file: sys/arch/mips64/include/elf.h
diff -N sys/arch/mips64/include/elf.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sys/arch/mips64/include/elf.h	10 Jul 2024 16:17:09 -0000
@@ -0,0 +1,7 @@
+/*	$OpenBSD$	*/
+
+/*
+ * This file is in the public domain.
+ */
+
+/* Nothing for now */
Index: sys/arch/powerpc/include/elf.h
===================================================================
RCS file: sys/arch/powerpc/include/elf.h
diff -N sys/arch/powerpc/include/elf.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sys/arch/powerpc/include/elf.h	10 Jul 2024 16:17:09 -0000
@@ -0,0 +1,14 @@
+/*	$OpenBSD$	*/
+
+/*
+ * This file is in the public domain.
+ */
+
+#ifndef _MACHINE_ELF_H_
+#define	_MACHINE_ELF_H_ 1
+
+/*
+ * TODO FreeBSD puts PPC_FEATURE* in cpu.h
+ */
+
+#endif /* !_MACHINE_ELF_H_ */
Index: sys/arch/powerpc64/include/elf.h
===================================================================
RCS file: sys/arch/powerpc64/include/elf.h
diff -N sys/arch/powerpc64/include/elf.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sys/arch/powerpc64/include/elf.h	10 Jul 2024 16:17:09 -0000
@@ -0,0 +1,14 @@
+/*	$OpenBSD$	*/
+
+/*
+ * This file is in the public domain.
+ */
+
+#ifndef _MACHINE_ELF_H_
+#define	_MACHINE_ELF_H_ 1
+
+/*
+ * TODO FreeBSD puts PPC_FEATURE* in cpu.h
+ */
+
+#endif /* !_MACHINE_ELF_H_ */
Index: sys/arch/riscv64/include/elf.h
===================================================================
RCS file: sys/arch/riscv64/include/elf.h
diff -N sys/arch/riscv64/include/elf.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sys/arch/riscv64/include/elf.h	10 Jul 2024 16:17:09 -0000
@@ -0,0 +1,52 @@
+/*	$OpenBSD$	*/
+
+/*-
+ * Copyright (c) 1996-1997 John D. Polstra.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef	_MACHINE_ELF_H_
+#define	_MACHINE_ELF_H_
+
+/*
+ * ELF definitions for the RISC-V architecture.
+ */
+
+#ifdef _KERNEL
+# define __HAVE_CPU_HWCAP
+extern unsigned long	hwcap;
+#endif /* _KERNEL */
+
+/* Flags passed in AT_HWCAP */
+#define	HWCAP_ISA_BIT(c)	(1 << ((c) - 'a'))
+#define	HWCAP_ISA_I		HWCAP_ISA_BIT('i')
+#define	HWCAP_ISA_M		HWCAP_ISA_BIT('m')
+#define	HWCAP_ISA_A		HWCAP_ISA_BIT('a')
+#define	HWCAP_ISA_F		HWCAP_ISA_BIT('f')
+#define	HWCAP_ISA_D		HWCAP_ISA_BIT('d')
+#define	HWCAP_ISA_C		HWCAP_ISA_BIT('c')
+#define	HWCAP_ISA_G		\
+    (HWCAP_ISA_I | HWCAP_ISA_M | HWCAP_ISA_A | HWCAP_ISA_F | HWCAP_ISA_D)
+
+#endif /* !_MACHINE_ELF_H_ */
Index: sys/arch/riscv64/riscv64/cpu.c
===================================================================
RCS file: /cvs/src/sys/arch/riscv64/riscv64/cpu.c,v
diff -u -p -r1.19 cpu.c
--- sys/arch/riscv64/riscv64/cpu.c	11 Jun 2024 15:44:55 -0000	1.19
+++ sys/arch/riscv64/riscv64/cpu.c	10 Jul 2024 16:17:09 -0000
@@ -28,6 +28,7 @@
 #include <uvm/uvm.h>
 
 #include <machine/cpufunc.h>
+#include <machine/elf.h>
 #include <machine/fdt.h>
 #include <machine/sbi.h>
 
@@ -235,6 +236,8 @@ cpu_attach(struct device *parent, struct
 	} else {
 #endif
 		cpu_identify(ci);
+
+		hwcap |= HWCAP_ISA_G;
 
 		if (OF_getproplen(ci->ci_node, "clocks") > 0) {
 			cpu_node = ci->ci_node;
Index: sys/arch/sh/include/elf.h
===================================================================
RCS file: sys/arch/sh/include/elf.h
diff -N sys/arch/sh/include/elf.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sys/arch/sh/include/elf.h	10 Jul 2024 16:17:09 -0000
@@ -0,0 +1,7 @@
+/*	$OpenBSD$	*/
+
+/*
+ * This file is in the public domain.
+ */
+
+/* Nothing for now */
Index: sys/arch/sparc64/include/elf.h
===================================================================
RCS file: sys/arch/sparc64/include/elf.h
diff -N sys/arch/sparc64/include/elf.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sys/arch/sparc64/include/elf.h	10 Jul 2024 16:17:09 -0000
@@ -0,0 +1,7 @@
+/*	$OpenBSD$	*/
+
+/*
+ * This file is in the public domain.
+ */
+
+/* Nothing for now */
Index: sys/kern/exec_elf.c
===================================================================
RCS file: /cvs/src/sys/kern/exec_elf.c,v
diff -u -p -r1.186 exec_elf.c
--- sys/kern/exec_elf.c	2 Apr 2024 08:39:16 -0000	1.186
+++ sys/kern/exec_elf.c	10 Jul 2024 16:17:09 -0000
@@ -89,6 +89,7 @@
 
 #include <machine/reg.h>
 #include <machine/exec.h>
+#include <machine/elf.h>
 
 int	elf_load_file(struct proc *, char *, struct exec_package *,
 	    struct elf_args *);
@@ -994,6 +995,18 @@ exec_elf_fixup(struct proc *p, struct ex
 		a->au_id = AUX_entry;
 		a->au_v = ap->arg_entry;
 		a++;
+
+#ifdef __HAVE_CPU_HWCAP
+		a->au_id = AUX_hwcap;
+		a->au_v = hwcap;
+		a++;
+#endif /* __HAVE_CPU_HWCAP */
+
+#ifdef __HAVE_CPU_HWCAP2
+		a->au_id = AUX_hwcap2;
+		a->au_v = hwcap2;
+		a++;
+#endif /* __HAVE_CPU_HWCAP2 */
 
 		a->au_id = AUX_openbsd_timekeep;
 		a->au_v = p->p_p->ps_timekeep;
Index: sys/sys/auxv.h
===================================================================
RCS file: sys/sys/auxv.h
diff -N sys/sys/auxv.h
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ sys/sys/auxv.h	10 Jul 2024 16:17:09 -0000
@@ -0,0 +1,82 @@
+/*	$OpenBSD$	*/
+
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause
+ *
+ * Copyright (c) 2017 Michal Meloun
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef	_SYS_AUXV_H_
+#define	_SYS_AUXV_H_
+
+#include <sys/types.h>
+#include <machine/elf.h>
+
+/* Values for a_type. */
+#define	AT_NULL		0	/* Terminates the vector. */
+#define	AT_IGNORE	1	/* Ignored entry. */
+#define	AT_EXECFD	2	/* File descriptor of program to load. */
+#define	AT_PHDR		3	/* Program header of program already loaded. */
+#define	AT_PHENT	4	/* Size of each program header entry. */
+#define	AT_PHNUM	5	/* Number of program header entries. */
+#define	AT_PAGESZ	6	/* Page size in bytes. */
+#define	AT_BASE		7	/* Interpreter's base address. */
+#define	AT_FLAGS	8	/* Flags. */
+#define	AT_ENTRY	9	/* Where interpreter should transfer control. */
+#define	AT_NOTELF	10	/* Program is not ELF ?? */
+#define	AT_UID		11	/* Real uid. */
+#define	AT_EUID		12	/* Effective uid. */
+#define	AT_GID		13	/* Real gid. */
+#define	AT_EGID		14	/* Effective gid. */
+#define	AT_EXECPATH	15	/* Path to the executable. */
+#define	AT_CANARY	16	/* Canary for SSP. */
+#define	AT_CANARYLEN	17	/* Length of the canary. */
+#define	AT_OSRELDATE	18	/* OSRELDATE. */
+#define	AT_NCPUS	19	/* Number of CPUs. */
+#define	AT_PAGESIZES	20	/* Pagesizes. */
+#define	AT_PAGESIZESLEN	21	/* Number of pagesizes. */
+#define	AT_TIMEKEEP	22	/* Pointer to timehands. */
+#define	AT_STACKPROT	23	/* Initial stack protection. */
+#define	AT_EHDRFLAGS	24	/* e_flags field from elf hdr */
+#define	AT_HWCAP	25	/* CPU feature flags. */
+#define	AT_HWCAP2	26	/* CPU feature flags 2. */
+#define	AT_BSDFLAGS	27	/* ELF BSD Flags. */
+#define	AT_ARGC		28	/* Argument count */
+#define	AT_ARGV		29	/* Argument vector */
+#define	AT_ENVC		30	/* Environment count */
+#define	AT_ENVV		31	/* Environment vector */
+#define	AT_PS_STRINGS	32	/* struct ps_strings */
+#define	AT_FXRNG	33	/* Pointer to root RNG seed version. */
+#define	AT_KPRELOAD	34	/* Base of vdso, preloaded by rtld */
+#define	AT_USRSTACKBASE	35	/* Top of user stack */
+#define	AT_USRSTACKLIM	36	/* Grow limit of user stack */
+
+#define	AT_COUNT	37	/* Count of defined aux entry types. */
+
+__BEGIN_DECLS
+int elf_aux_info(int aux, void *buf, int buflen);
+__END_DECLS
+
+#endif /* !_SYS_AUXV_H_ */
Index: sys/sys/exec_elf.h
===================================================================
RCS file: /cvs/src/sys/sys/exec_elf.h,v
diff -u -p -r1.104 exec_elf.h
--- sys/sys/exec_elf.h	22 Jun 2024 12:26:17 -0000	1.104
+++ sys/sys/exec_elf.h	10 Jul 2024 16:17:09 -0000
@@ -725,8 +725,10 @@ enum AuxID {
 	AUX_phnum = 5,			/* # phdr entries */
 	AUX_pagesz = 6,			/* PAGESIZE */
 	AUX_base = 7,			/* base addr for ld.so or static PIE */
-	AUX_flags = 8,			/* processor flags */
+	AUX_flags = 8,			/* SUN processor flags */
 	AUX_entry = 9,			/* a.out entry */
+	AUX_hwcap = 25,			/* processor flags */
+	AUX_hwcap2 = 26,		/* processor flags (continued) */
 	AUX_sun_uid = 2000,		/* euid */
 	AUX_sun_ruid = 2001,		/* ruid */
 	AUX_sun_gid = 2002,		/* egid */
@@ -820,7 +822,7 @@ extern Elf_Dyn		_DYNAMIC[];
 /*
  * How many entries are in the AuxInfo array we pass to the process?
  */
-#define	ELF_AUX_ENTRIES	9
+#define	ELF_AUX_ENTRIES	11
 #define	ELF_AUX_WORDS	(sizeof(AuxInfo) * ELF_AUX_ENTRIES / sizeof(char *))
 
 struct exec_package;
? regress/lib/libc/elf_aux_info/obj
Index: regress/lib/libc/elf_aux_info/Makefile
===================================================================
RCS file: regress/lib/libc/elf_aux_info/Makefile
diff -N regress/lib/libc/elf_aux_info/Makefile
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ regress/lib/libc/elf_aux_info/Makefile	10 Jul 2024 16:22:51 -0000
@@ -0,0 +1,3 @@
+PROG=elf_aux_info
+
+.include <bsd.regress.mk>
Index: regress/lib/libc/elf_aux_info/elf_aux_info.c
===================================================================
RCS file: regress/lib/libc/elf_aux_info/elf_aux_info.c
diff -N regress/lib/libc/elf_aux_info/elf_aux_info.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ regress/lib/libc/elf_aux_info/elf_aux_info.c	10 Jul 2024 16:22:51 -0000
@@ -0,0 +1,54 @@
+#include <sys/auxv.h>
+
+#include <errno.h>
+#include <stdio.h>
+
+int
+main(void)
+{
+	int ret = 0;
+	int a;
+	unsigned long b;
+
+
+	/* Should always succeed */
+	if (elf_aux_info(AT_PAGESZ, &a, sizeof(a)))
+		ret |= 1;
+	else
+		fprintf(stderr, "AT_PAGESZ %d\n", a);
+
+	/* Wrong size */
+	if (elf_aux_info(AT_PAGESZ, &b, sizeof(b)) != EINVAL)
+		ret |= 2;
+
+	/* Invalid request */
+	if (elf_aux_info(-1, &a, sizeof(a)) != EINVAL)
+		ret |= 4;
+
+	/* Should either succeed or fail with ENOENT if not supported */
+	switch (elf_aux_info(AT_HWCAP, &b, sizeof(b))) {
+	case 0:
+		fprintf(stderr, "AT_HWCAP %lx\n", b);
+		break;
+	case ENOENT:
+		break;
+	default:
+		ret |= 8;
+	}
+
+	/* Should either succeed or fail with ENOENT if not supported */
+	switch (elf_aux_info(AT_HWCAP2, &b, sizeof(b))) {
+	case 0:
+		fprintf(stderr, "AT_HWCAP2 %lx\n", b);
+		break;
+	case ENOENT:
+		break;
+	default:
+		ret |= 16;
+	}
+
+	if (ret)
+		fprintf(stderr, "FAILED (status %x)\n", ret);
+		
+	return ret;
+}

-- 
jca