Add elf_aux_info(3)
authorjca <jca@openbsd.org>
Sun, 14 Jul 2024 09:48:48 +0000 (09:48 +0000)
committerjca <jca@openbsd.org>
Sun, 14 Jul 2024 09:48:48 +0000 (09:48 +0000)
Designed to let userland peek at AT_HWCAP and AT_HWCAP2 using an already
existing interface coming from FreeBSD. Headers bits were snatched from
there.  Input & ok kettenis@

libc bump and sets sync will follow soon

26 files changed:
lib/libc/Symbols.list
lib/libc/dlfcn/init.c
lib/libc/gen/Makefile.inc
lib/libc/gen/elf_aux_info.3 [new file with mode: 0644]
lib/libc/gen/elf_aux_info.c [new file with mode: 0644]
lib/libc/hidden/sys/auxv.h [new file with mode: 0644]
regress/lib/libc/Makefile
regress/lib/libc/elf_aux_info/Makefile [new file with mode: 0644]
regress/lib/libc/elf_aux_info/elf_aux_info.c [new file with mode: 0644]
sys/arch/alpha/include/elf.h [new file with mode: 0644]
sys/arch/amd64/include/elf.h [new file with mode: 0644]
sys/arch/arm/include/elf.h [new file with mode: 0644]
sys/arch/arm64/arm64/cpu.c
sys/arch/arm64/include/elf.h [new file with mode: 0644]
sys/arch/hppa/include/elf.h [new file with mode: 0644]
sys/arch/i386/include/elf.h [new file with mode: 0644]
sys/arch/m88k/include/elf.h [new file with mode: 0644]
sys/arch/mips64/include/elf.h [new file with mode: 0644]
sys/arch/powerpc/include/elf.h [new file with mode: 0644]
sys/arch/powerpc64/include/elf.h [new file with mode: 0644]
sys/arch/riscv64/include/elf.h [new file with mode: 0644]
sys/arch/riscv64/riscv64/cpu.c
sys/arch/sh/include/elf.h [new file with mode: 0644]
sys/arch/sparc64/include/elf.h [new file with mode: 0644]
sys/sys/auxv.h [new file with mode: 0644]
sys/sys/exec_elf.h

index eb4d78c..48c4965 100644 (file)
@@ -608,6 +608,7 @@ daemon
 devname
 dirfd
 dirname
+elf_aux_info
 endfsent
 endgrent
 endnetgrent
index 9fc63c9..c7b8fd2 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: init.c,v 1.22 2024/01/21 17:18:13 kettenis Exp $ */
+/*     $OpenBSD: init.c,v 1.23 2024/07/14 09:48:48 jca Exp $ */
 /*
  * Copyright (c) 2014,2015 Philip Guenther <guenther@openbsd.org>
  *
@@ -49,6 +49,8 @@ char  ***_csu_finish(char **_argv, char **_envp, void (*_cleanup)(void));
 /* 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, char **envp, dl_cb_cb *cb)
                ;
        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 cf36ead..f87cc7a 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: Makefile.inc,v 1.82 2019/09/02 21:18:40 deraadt Exp $
+#      $OpenBSD: Makefile.inc,v 1.83 2024/07/14 09:48:48 jca Exp $
 
 # gen sources
 .PATH: ${LIBCSRCDIR}/arch/${MACHINE_CPU}/gen ${LIBCSRCDIR}/gen
@@ -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 authenticate.c \
 
 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 \
diff --git a/lib/libc/gen/elf_aux_info.3 b/lib/libc/gen/elf_aux_info.3
new file mode 100644 (file)
index 0000000..1bd1a09
--- /dev/null
@@ -0,0 +1,74 @@
+.\"    $OpenBSD: elf_aux_info.3,v 1.1 2024/07/14 09:48:48 jca Exp $
+.\"
+.\" 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: July 14 2024 $
+.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 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 can be requested (corresponding buffer sizes are
+specified in parenthesis):
+.Bl -tag -width AT_HWCAP2
+.It AT_HWCAP
+CPU / hardware feature flags
+.Dv (sizeof(unsigned long)) .
+.It AT_HWCAP2
+CPU / hardware feature flags
+.Dv (sizeof(unsigned long)) .
+.It AT_PAGESZ
+Page size in bytes
+.Dv (sizeof(int)) .
+.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 .
diff --git a/lib/libc/gen/elf_aux_info.c b/lib/libc/gen/elf_aux_info.c
new file mode 100644 (file)
index 0000000..a4b7667
--- /dev/null
@@ -0,0 +1,70 @@
+/*     $OpenBSD: elf_aux_info.c,v 1.1 2024/07/14 09:48:48 jca Exp $    */
+
+/*
+ * 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;
+}
diff --git a/lib/libc/hidden/sys/auxv.h b/lib/libc/hidden/sys/auxv.h
new file mode 100644 (file)
index 0000000..cd566b7
--- /dev/null
@@ -0,0 +1,26 @@
+/*     $OpenBSD: auxv.h,v 1.1 2024/07/14 09:48:48 jca Exp $    */
+
+/*
+ * 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 8b5e4d4..3cd970e 100644 (file)
@@ -1,10 +1,11 @@
-#      $OpenBSD: Makefile,v 1.58 2021/08/31 09:58:17 jasper Exp $
+#      $OpenBSD: Makefile,v 1.59 2024/07/14 09:48:48 jca Exp $
 
 SUBDIR+= _setjmp
 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
diff --git a/regress/lib/libc/elf_aux_info/Makefile b/regress/lib/libc/elf_aux_info/Makefile
new file mode 100644 (file)
index 0000000..2885fb1
--- /dev/null
@@ -0,0 +1,3 @@
+PROG=elf_aux_info
+
+.include <bsd.regress.mk>
diff --git a/regress/lib/libc/elf_aux_info/elf_aux_info.c b/regress/lib/libc/elf_aux_info/elf_aux_info.c
new file mode 100644 (file)
index 0000000..481085d
--- /dev/null
@@ -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;
+}
diff --git a/sys/arch/alpha/include/elf.h b/sys/arch/alpha/include/elf.h
new file mode 100644 (file)
index 0000000..1bd15ef
--- /dev/null
@@ -0,0 +1,7 @@
+/*     $OpenBSD: elf.h,v 1.1 2024/07/14 09:48:48 jca Exp $     */
+
+/*
+ * This file is in the public domain.
+ */
+
+/* Nothing for now */
diff --git a/sys/arch/amd64/include/elf.h b/sys/arch/amd64/include/elf.h
new file mode 100644 (file)
index 0000000..1bd15ef
--- /dev/null
@@ -0,0 +1,7 @@
+/*     $OpenBSD: elf.h,v 1.1 2024/07/14 09:48:48 jca Exp $     */
+
+/*
+ * This file is in the public domain.
+ */
+
+/* Nothing for now */
diff --git a/sys/arch/arm/include/elf.h b/sys/arch/arm/include/elf.h
new file mode 100644 (file)
index 0000000..248648e
--- /dev/null
@@ -0,0 +1,77 @@
+/*     $OpenBSD: elf.h,v 1.1 2024/07/14 09:48:48 jca Exp $     */
+
+/*-
+ * 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_
+
+/*
+ * 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 47b2534..6989805 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cpu.c,v 1.125 2024/07/11 12:07:39 kettenis Exp $      */
+/*     $OpenBSD: cpu.c,v 1.126 2024/07/14 09:48:48 jca Exp $   */
 
 /*
  * Copyright (c) 2016 Dale Rahn <drahn@dalerahn.com>
@@ -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>
@@ -741,6 +742,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) {
diff --git a/sys/arch/arm64/include/elf.h b/sys/arch/arm64/include/elf.h
new file mode 100644 (file)
index 0000000..53be0b9
--- /dev/null
@@ -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_ */
diff --git a/sys/arch/hppa/include/elf.h b/sys/arch/hppa/include/elf.h
new file mode 100644 (file)
index 0000000..1bd15ef
--- /dev/null
@@ -0,0 +1,7 @@
+/*     $OpenBSD: elf.h,v 1.1 2024/07/14 09:48:48 jca Exp $     */
+
+/*
+ * This file is in the public domain.
+ */
+
+/* Nothing for now */
diff --git a/sys/arch/i386/include/elf.h b/sys/arch/i386/include/elf.h
new file mode 100644 (file)
index 0000000..1bd15ef
--- /dev/null
@@ -0,0 +1,7 @@
+/*     $OpenBSD: elf.h,v 1.1 2024/07/14 09:48:48 jca Exp $     */
+
+/*
+ * This file is in the public domain.
+ */
+
+/* Nothing for now */
diff --git a/sys/arch/m88k/include/elf.h b/sys/arch/m88k/include/elf.h
new file mode 100644 (file)
index 0000000..1bd15ef
--- /dev/null
@@ -0,0 +1,7 @@
+/*     $OpenBSD: elf.h,v 1.1 2024/07/14 09:48:48 jca Exp $     */
+
+/*
+ * This file is in the public domain.
+ */
+
+/* Nothing for now */
diff --git a/sys/arch/mips64/include/elf.h b/sys/arch/mips64/include/elf.h
new file mode 100644 (file)
index 0000000..1bd15ef
--- /dev/null
@@ -0,0 +1,7 @@
+/*     $OpenBSD: elf.h,v 1.1 2024/07/14 09:48:48 jca Exp $     */
+
+/*
+ * This file is in the public domain.
+ */
+
+/* Nothing for now */
diff --git a/sys/arch/powerpc/include/elf.h b/sys/arch/powerpc/include/elf.h
new file mode 100644 (file)
index 0000000..6624f42
--- /dev/null
@@ -0,0 +1,14 @@
+/*     $OpenBSD: elf.h,v 1.1 2024/07/14 09:48:48 jca Exp $     */
+
+/*
+ * This file is in the public domain.
+ */
+
+#ifndef        _MACHINE_ELF_H_
+#define        _MACHINE_ELF_H_
+
+/*
+ * TODO FreeBSD puts PPC_FEATURE* in cpu.h
+ */
+
+#endif /* !_MACHINE_ELF_H_ */
diff --git a/sys/arch/powerpc64/include/elf.h b/sys/arch/powerpc64/include/elf.h
new file mode 100644 (file)
index 0000000..a3503ab
--- /dev/null
@@ -0,0 +1,14 @@
+/*     $OpenBSD: elf.h,v 1.1 2024/07/14 09:48:49 jca Exp $     */
+
+/*
+ * This file is in the public domain.
+ */
+
+#ifndef        _MACHINE_ELF_H_
+#define        _MACHINE_ELF_H_
+
+/*
+ * TODO FreeBSD puts PPC_FEATURE* in cpu.h
+ */
+
+#endif /* !_MACHINE_ELF_H_ */
diff --git a/sys/arch/riscv64/include/elf.h b/sys/arch/riscv64/include/elf.h
new file mode 100644 (file)
index 0000000..f316cf9
--- /dev/null
@@ -0,0 +1,52 @@
+/*     $OpenBSD: elf.h,v 1.3 2024/07/14 09:48:49 jca Exp $     */
+
+/*-
+ * 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 0d40b23..656c8f2 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: cpu.c,v 1.19 2024/06/11 15:44:55 kettenis Exp $       */
+/*     $OpenBSD: cpu.c,v 1.20 2024/07/14 09:48:49 jca Exp $    */
 
 /*
  * Copyright (c) 2016 Dale Rahn <drahn@dalerahn.com>
@@ -28,6 +28,7 @@
 #include <uvm/uvm.h>
 
 #include <machine/cpufunc.h>
+#include <machine/elf.h>
 #include <machine/fdt.h>
 #include <machine/sbi.h>
 
@@ -236,6 +237,8 @@ cpu_attach(struct device *parent, struct device *dev, void *aux)
 #endif
                cpu_identify(ci);
 
+               hwcap |= HWCAP_ISA_G | HWCAP_ISA_C;
+
                if (OF_getproplen(ci->ci_node, "clocks") > 0) {
                        cpu_node = ci->ci_node;
                        cpu_cpuspeed = cpu_clockspeed;
diff --git a/sys/arch/sh/include/elf.h b/sys/arch/sh/include/elf.h
new file mode 100644 (file)
index 0000000..cc2a3bb
--- /dev/null
@@ -0,0 +1,7 @@
+/*     $OpenBSD: elf.h,v 1.1 2024/07/14 09:48:49 jca Exp $     */
+
+/*
+ * This file is in the public domain.
+ */
+
+/* Nothing for now */
diff --git a/sys/arch/sparc64/include/elf.h b/sys/arch/sparc64/include/elf.h
new file mode 100644 (file)
index 0000000..cc2a3bb
--- /dev/null
@@ -0,0 +1,7 @@
+/*     $OpenBSD: elf.h,v 1.1 2024/07/14 09:48:49 jca Exp $     */
+
+/*
+ * This file is in the public domain.
+ */
+
+/* Nothing for now */
diff --git a/sys/sys/auxv.h b/sys/sys/auxv.h
new file mode 100644 (file)
index 0000000..166dc71
--- /dev/null
@@ -0,0 +1,50 @@
+/*     $OpenBSD: auxv.h,v 1.1 2024/07/14 09:48:49 jca Exp $    */
+
+/*-
+ * 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_PAGESZ       6       /* Page size in bytes. */
+#define        AT_HWCAP        25      /* CPU feature flags. */
+#define        AT_HWCAP2       26      /* CPU feature flags 2. */
+
+#define        AT_COUNT        27      /* 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 7825dff..7e75401 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: exec_elf.h,v 1.104 2024/06/22 12:26:17 deraadt Exp $  */
+/*     $OpenBSD: exec_elf.h,v 1.105 2024/07/14 09:48:49 jca Exp $      */
 /*
  * Copyright (c) 1995, 1996 Erik Theisen.  All rights reserved.
  *
@@ -727,6 +727,8 @@ enum AuxID {
        AUX_base = 7,                   /* base addr for ld.so or static PIE */
        AUX_flags = 8,                  /* 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;