bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 5/9] aarch64: Add mach_aarch64 API


From: Sergey Bugaev
Subject: [PATCH 5/9] aarch64: Add mach_aarch64 API
Date: Mon, 15 Apr 2024 12:01:45 +0300

This currently contains a single RPC to get Linux-compatible hwcaps,
as well as the values of MIDR_EL1 and REVIDR_EL1 system registers.

In the future, this is expected to host the APIs to manage PAC keys,
and possibly some sort of AArch64-specific APIs for userland IRQ
handlers.
---
 aarch64/Makefrag.am                           |   3 +
 aarch64/aarch64/mach_aarch64.srv              |  23 ++++
 .../include/mach/aarch64/mach_aarch64.defs    |  52 ++++++++
 .../include/mach/aarch64/mach_aarch64_types.h | 118 ++++++++++++++++++
 4 files changed, 196 insertions(+)
 create mode 100644 aarch64/aarch64/mach_aarch64.srv
 create mode 100644 aarch64/include/mach/aarch64/mach_aarch64.defs
 create mode 100644 aarch64/include/mach/aarch64/mach_aarch64_types.h

diff --git a/aarch64/Makefrag.am b/aarch64/Makefrag.am
index 3da88c18..ff7bcefb 100644
--- a/aarch64/Makefrag.am
+++ b/aarch64/Makefrag.am
@@ -17,6 +17,7 @@
 # Building a distribution.
 #
 EXTRA_DIST += \
+       aarch64/aarch64/mach_aarch64.srv \
        aarch64/include/mach/aarch64
 
 if HOST_aarch64
@@ -30,6 +31,8 @@ include_mach_aarch64_HEADERS = \
        aarch64/include/mach/aarch64/asm.h \
        aarch64/include/mach/aarch64/boolean.h \
        aarch64/include/mach/aarch64/kern_return.h \
+       aarch64/include/mach/aarch64/mach_aarch64.defs \
+       aarch64/include/mach/aarch64/mach_aarch64_types.h \
        aarch64/include/mach/aarch64/machine_types.defs \
        aarch64/include/mach/aarch64/syscall_sw.h \
        aarch64/include/mach/aarch64/vm_param.h \
diff --git a/aarch64/aarch64/mach_aarch64.srv b/aarch64/aarch64/mach_aarch64.srv
new file mode 100644
index 00000000..7dd8f9e9
--- /dev/null
+++ b/aarch64/aarch64/mach_aarch64.srv
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2023-2024 Free Software Foundation.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/* This is a server presentation file.  */
+
+#define KERNEL_SERVER 1
+
+#include <mach/machine/mach_aarch64.defs>
diff --git a/aarch64/include/mach/aarch64/mach_aarch64.defs 
b/aarch64/include/mach/aarch64/mach_aarch64.defs
new file mode 100644
index 00000000..0fe1eb62
--- /dev/null
+++ b/aarch64/include/mach/aarch64/mach_aarch64.defs
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2023-2024 Free Software Foundation.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+/*
+ * Special functions for aarch64.
+ */
+
+subsystem
+#if    KERNEL_SERVER
+         KernelServer
+#endif /* KERNEL_SERVER */
+                      mach_aarch64 4500;
+
+#include <mach/std_types.defs>
+#include <mach/mach_types.defs>
+
+#ifdef MACH_AARCH64_IMPORTS
+MACH_AARCH64_IMPORTS
+#endif
+
+import <mach/machine/mach_aarch64_types.h>;
+
+/*
+ *     An array containing bitmasks; the meaning of individual
+ *     bits is defined by the HWCAP_* and HWCAP2_* constants
+ *     from the mach_aarch64_types.h header. In this version
+ *     of Mach, the array will contain two items, but future
+ *     versions can add more items and more bits (HWCAP3_* and
+ *     so forth).
+ */
+type   hwcaps_t        =       array[*:16] of uint32_t;
+
+routine aarch64_get_hwcaps(
+               host            : host_t;
+       out     hwcaps          : hwcaps_t, CountInOut;
+       out     midr_el1        : uint64_t;
+       out     revidr_el1      : uint64_t);
diff --git a/aarch64/include/mach/aarch64/mach_aarch64_types.h 
b/aarch64/include/mach/aarch64/mach_aarch64_types.h
new file mode 100644
index 00000000..98fd6c4b
--- /dev/null
+++ b/aarch64/include/mach/aarch64/mach_aarch64_types.h
@@ -0,0 +1,118 @@
+/*
+ * Copyright (c) 2023-2024 Free Software Foundation.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef _MACH_MACH_AARCH64_TYPES_H_
+#define _MACH_MACH_AARCH64_TYPES_H_
+
+/* The currently defined number of hwcap values.
+   More ones could be added in future versions.  */
+#define HWCAPS_COUNT   2
+
+#ifndef __ASSEMBLER__
+#include <stdint.h>
+typedef uint32_t *hwcaps_t;
+#endif
+
+/* These definitions are meant to match those in
+   linux:arch/arm64/include/uapi/asm/hwcap.h and
+   glibc:sysdeps/unix/sysv/linux/aarch64/bits/hwcap.h,
+   but this is not strictly required for anything.  */
+
+#define HWCAP_FP               (1 << 0)
+#define HWCAP_ASIMD            (1 << 1)
+#define HWCAP_EVTSTRM          (1 << 2)
+#define HWCAP_AES              (1 << 3)
+#define HWCAP_PMULL            (1 << 4)
+#define HWCAP_SHA1             (1 << 5)
+#define HWCAP_SHA2             (1 << 6)
+#define HWCAP_CRC32            (1 << 7)
+#define HWCAP_ATOMICS          (1 << 8)
+#define HWCAP_FPHP             (1 << 9)
+#define HWCAP_ASIMDHP          (1 << 10)
+#define HWCAP_CPUID            (1 << 11)
+#define HWCAP_ASIMDRDM         (1 << 12)
+#define HWCAP_JSCVT            (1 << 13)
+#define HWCAP_FCMA             (1 << 14)
+#define HWCAP_LRCPC            (1 << 15)
+#define HWCAP_DCPOP            (1 << 16)
+#define HWCAP_SHA3             (1 << 17)
+#define HWCAP_SM3              (1 << 18)
+#define HWCAP_SM4              (1 << 19)
+#define HWCAP_ASIMDDP          (1 << 20)
+#define HWCAP_SHA512           (1 << 21)
+#define HWCAP_SVE              (1 << 22)
+#define HWCAP_ASIMDFHM         (1 << 23)
+#define HWCAP_DIT              (1 << 24)
+#define HWCAP_USCAT            (1 << 25)
+#define HWCAP_ILRCPC           (1 << 26)
+#define HWCAP_FLAGM            (1 << 27)
+#define HWCAP_SSBS             (1 << 28)
+#define HWCAP_SB               (1 << 29)
+#define HWCAP_PACA             (1 << 30)
+#define HWCAP_PACG             (1UL << 31)
+
+#define HWCAP2_DCPODP          (1 << 0)
+#define HWCAP2_SVE2            (1 << 1)
+#define HWCAP2_SVEAES          (1 << 2)
+#define HWCAP2_SVEPMULL                (1 << 3)
+#define HWCAP2_SVEBITPERM      (1 << 4)
+#define HWCAP2_SVESHA3         (1 << 5)
+#define HWCAP2_SVESM4          (1 << 6)
+#define HWCAP2_FLAGM2          (1 << 7)
+#define HWCAP2_FRINT           (1 << 8)
+#define HWCAP2_SVEI8MM         (1 << 9)
+#define HWCAP2_SVEF32MM                (1 << 10)
+#define HWCAP2_SVEF64MM                (1 << 11)
+#define HWCAP2_SVEBF16         (1 << 12)
+#define HWCAP2_I8MM            (1 << 13)
+#define HWCAP2_BF16            (1 << 14)
+#define HWCAP2_DGH             (1 << 15)
+#define HWCAP2_RNG             (1 << 16)
+#define HWCAP2_BTI             (1 << 17)
+#define HWCAP2_MTE             (1 << 18)
+#define HWCAP2_ECV             (1 << 19)
+#define HWCAP2_AFP             (1 << 20)
+#define HWCAP2_RPRES           (1 << 21)
+#define HWCAP2_MTE3            (1 << 22)
+#define HWCAP2_SME             (1 << 23)
+#define HWCAP2_SME_I16I64      (1 << 24)
+#define HWCAP2_SME_F64F64      (1 << 25)
+#define HWCAP2_SME_I8I32       (1 << 26)
+#define HWCAP2_SME_F16F32      (1 << 27)
+#define HWCAP2_SME_B16F32      (1 << 28)
+#define HWCAP2_SME_F32F32      (1 << 29)
+#define HWCAP2_SME_FA64                (1 << 30)
+#define HWCAP2_WFXT            (1UL << 31)
+#define HWCAP2_EBF16           (1UL << 32)
+#define HWCAP2_SVE_EBF16       (1UL << 33)
+#define HWCAP2_CSSC            (1UL << 34)
+#define HWCAP2_RPRFM           (1UL << 35)
+#define HWCAP2_SVE2P1          (1UL << 36)
+#define HWCAP2_SME2            (1UL << 37)
+#define HWCAP2_SME2P1          (1UL << 38)
+#define HWCAP2_SME_I16I32      (1UL << 39)
+#define HWCAP2_SME_BI32I32     (1UL << 40)
+#define HWCAP2_SME_B16B16      (1UL << 41)
+#define HWCAP2_SME_F16F16      (1UL << 42)
+#define HWCAP2_MOPS            (1UL << 43)
+#define HWCAP2_HBC             (1UL << 44)
+#define HWCAP2_SVE_B16B16      (1UL << 45)
+#define HWCAP2_LRCPC3          (1UL << 46)
+#define HWCAP2_LSE128          (1UL << 47)
+
+#endif
-- 
2.44.0




reply via email to

[Prev in Thread] Current Thread [Next in Thread]