From d37c7a3fdb2edf5d3865fbac547297651a9b1941 Mon Sep 17 00:00:00 2001 From: Sergey Bugaev Date: Mon, 15 Apr 2024 12:01:45 +0300 Subject: aarch64: Add mach_aarch64 API 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. Message-ID: <20240415090149.38358-6-bugaevc@gmail.com> --- aarch64/Makefrag.am | 3 + aarch64/aarch64/mach_aarch64.srv | 23 +++++ aarch64/include/mach/aarch64/mach_aarch64.defs | 52 ++++++++++ aarch64/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 (limited to 'aarch64') 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 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 +#include + +#ifdef MACH_AARCH64_IMPORTS +MACH_AARCH64_IMPORTS +#endif + +import ; + +/* + * 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 +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 -- cgit v1.2.3