xref: /freebsd/sys/arm64/include/elf.h (revision 94686b081fdb0c1bb0fc1dfeda14bd53f26ce7c5)
1 /*-
2  * Copyright (c) 1996-1997 John D. Polstra.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24  * SUCH DAMAGE.
25  */
26 
27 #ifdef __arm__
28 #include <arm/elf.h>
29 #else /* !__arm__ */
30 
31 #ifndef	_MACHINE_ELF_H_
32 #define	_MACHINE_ELF_H_
33 
34 /*
35  * ELF definitions for the AArch64 architecture.
36  */
37 
38 #include <sys/elf32.h>	/* Definitions common to all 32 bit architectures. */
39 #include <sys/elf64.h>	/* Definitions common to all 64 bit architectures. */
40 
41 #ifndef __ELF_WORD_SIZE
42 #define	__ELF_WORD_SIZE	64	/* Used by <sys/elf_generic.h> */
43 #endif
44 
45 #include <sys/elf_generic.h>
46 
47 /*
48  * Auxiliary vector entries for passing information to the interpreter.
49  */
50 
51 typedef struct {	/* Auxiliary vector entry on initial stack */
52 	int	a_type;			/* Entry type. */
53 	union {
54 		int	a_val;		/* Integer value. */
55 	} a_un;
56 } Elf32_Auxinfo;
57 
58 typedef struct {	/* Auxiliary vector entry on initial stack */
59 	long	a_type;			/* Entry type. */
60 	union {
61 		long	a_val;		/* Integer value. */
62 		void	*a_ptr;		/* Address. */
63 		void	(*a_fcn)(void);	/* Function pointer (not used). */
64 	} a_un;
65 } Elf64_Auxinfo;
66 
67 __ElfType(Auxinfo);
68 
69 #ifdef _MACHINE_ELF_WANT_32BIT
70 #define	ELF_ARCH	EM_ARM
71 #else
72 #define	ELF_ARCH	EM_AARCH64
73 #endif
74 
75 #define	ELF_MACHINE_OK(x) ((x) == (ELF_ARCH))
76 
77 /* Define "machine" characteristics */
78 #if __ELF_WORD_SIZE == 64
79 #define	ELF_TARG_CLASS	ELFCLASS64
80 #define	ELF_TARG_DATA	ELFDATA2LSB
81 #define	ELF_TARG_MACH	EM_AARCH64
82 #define	ELF_TARG_VER	1
83 #else
84 #define	ELF_TARG_CLASS	ELFCLASS32
85 #define	ELF_TARG_DATA	ELFDATA2LSB
86 #define	ELF_TARG_MACH	EM_ARM
87 #define	ELF_TARG_VER	1
88 #endif
89 
90 #if __ELF_WORD_SIZE == 32
91 #define	ET_DYN_LOAD_ADDR 0x01001000
92 #else
93 #define	ET_DYN_LOAD_ADDR 0x100000
94 #endif
95 
96 /* HWCAP */
97 #define	HWCAP_FP		(1 << 0)
98 #define	HWCAP_ASIMD		(1 << 1)
99 #define	HWCAP_EVTSTRM		(1 << 2)
100 #define	HWCAP_AES		(1 << 3)
101 #define	HWCAP_PMULL		(1 << 4)
102 #define	HWCAP_SHA1		(1 << 5)
103 #define	HWCAP_SHA2		(1 << 6)
104 #define	HWCAP_CRC32		(1 << 7)
105 #define	HWCAP_ATOMICS		(1 << 8)
106 #define	HWCAP_FPHP		(1 << 9)
107 #define	HWCAP_ASIMDHP		(1 << 10)
108 /*
109  * XXX: The following bits (from CPUID to FLAGM) were originally incorrect,
110  * but later changed to match the Linux definitions. No compatibility code is
111  * provided, as the fix was expected to result in near-zero fallout.
112  */
113 #define	HWCAP_CPUID		(1 << 11)
114 #define	HWCAP_ASIMDRDM		(1 << 12)
115 #define	HWCAP_JSCVT		(1 << 13)
116 #define	HWCAP_FCMA		(1 << 14)
117 #define	HWCAP_LRCPC		(1 << 15)
118 #define	HWCAP_DCPOP		(1 << 16)
119 #define	HWCAP_SHA3		(1 << 17)
120 #define	HWCAP_SM3		(1 << 18)
121 #define	HWCAP_SM4		(1 << 19)
122 #define	HWCAP_ASIMDDP		(1 << 20)
123 #define	HWCAP_SHA512		(1 << 21)
124 #define	HWCAP_SVE		(1 << 22)
125 #define	HWCAP_ASIMDFHM		(1 << 23)
126 #define	HWCAP_DIT		(1 << 24)
127 #define	HWCAP_USCAT		(1 << 25)
128 #define	HWCAP_ILRCPC		(1 << 26)
129 #define	HWCAP_FLAGM		(1 << 27)
130 #define	HWCAP_SSBS		(1 << 28)
131 #define	HWCAP_SB		(1 << 29)
132 #define	HWCAP_PACA		(1 << 30)
133 #define	HWCAP_PACG		(1UL << 31)
134 #define	HWCAP_GCS		(1UL << 32)
135 
136 /* HWCAP2 */
137 #define	HWCAP2_DCPODP		(1 << 0)
138 #define	HWCAP2_SVE2		(1 << 1)
139 #define	HWCAP2_SVEAES		(1 << 2)
140 #define	HWCAP2_SVEPMULL		(1 << 3)
141 #define	HWCAP2_SVEBITPERM	(1 << 4)
142 #define	HWCAP2_SVESHA3		(1 << 5)
143 #define	HWCAP2_SVESM4		(1 << 6)
144 #define	HWCAP2_FLAGM2		(1 << 7)
145 #define	HWCAP2_FRINT		(1 << 8)
146 #define	HWCAP2_SVEI8MM		(1 << 9)
147 #define	HWCAP2_SVEF32MM		(1 << 10)
148 #define	HWCAP2_SVEF64MM		(1 << 11)
149 #define	HWCAP2_SVEBF16		(1 << 12)
150 #define	HWCAP2_I8MM		(1 << 13)
151 #define	HWCAP2_BF16		(1 << 14)
152 #define	HWCAP2_DGH		(1 << 15)
153 #define	HWCAP2_RNG		(1 << 16)
154 #define	HWCAP2_BTI		(1 << 17)
155 #define	HWCAP2_MTE		(1 << 18)
156 #define	HWCAP2_ECV		(1 << 19)
157 #define	HWCAP2_AFP		(1 << 20)
158 #define	HWCAP2_RPRES		(1 << 21)
159 #define	HWCAP2_MTE3		(1 << 22)
160 #define	HWCAP2_SME		(1 << 23)
161 #define	HWCAP2_SME_I16I64	(1 << 24)
162 #define	HWCAP2_SME_F64F64	(1 << 25)
163 #define	HWCAP2_SME_I8I32	(1 << 26)
164 #define	HWCAP2_SME_F16F32	(1 << 27)
165 #define	HWCAP2_SME_B16F32	(1 << 28)
166 #define	HWCAP2_SME_F32F32	(1 << 29)
167 #define	HWCAP2_SME_FA64		(1 << 30)
168 #define	HWCAP2_WFXT		(1UL << 31)
169 #define	HWCAP2_EBF16		(1UL << 32)
170 #define	HWCAP2_SVE_EBF16	(1UL << 33)
171 #define	HWCAP2_CSSC		(1UL << 34)
172 #define	HWCAP2_RPRFM		(1UL << 35)
173 #define	HWCAP2_SVE2P1		(1UL << 36)
174 #define	HWCAP2_SME2		(1UL << 37)
175 #define	HWCAP2_SME2P1		(1UL << 38)
176 #define	HWCAP2_SME_I16I32	(1UL << 39)
177 #define	HWCAP2_SME_BI32I32	(1UL << 40)
178 #define	HWCAP2_SME_B16B16	(1UL << 41)
179 #define	HWCAP2_SME_F16F16	(1UL << 42)
180 #define	HWCAP2_MOPS		(1UL << 43)
181 #define	HWCAP2_HBC		(1UL << 44)
182 #define	HWCAP2_SVE_B16B16	(1UL << 45)
183 #define	HWCAP2_LRCPC3		(1UL << 46)
184 #define	HWCAP2_LSE128		(1UL << 47)
185 #define	HWCAP2_FPMR		(1UL << 48)
186 #define	HWCAP2_LUT		(1UL << 49)
187 #define	HWCAP2_FAMINMAX		(1UL << 50)
188 #define	HWCAP2_F8CVT		(1UL << 51)
189 #define	HWCAP2_F8FMA		(1UL << 52)
190 #define	HWCAP2_F8DP4		(1UL << 53)
191 #define	HWCAP2_F8DP2		(1UL << 54)
192 #define	HWCAP2_F8E4M3		(1UL << 55)
193 #define	HWCAP2_F8E5M2		(1UL << 56)
194 #define	HWCAP2_SME_LUTV2	(1UL << 57)
195 #define	HWCAP2_SME_F8F16	(1UL << 58)
196 #define	HWCAP2_SME_F8F32	(1UL << 59)
197 #define	HWCAP2_SME_SF8FMA	(1UL << 60)
198 #define	HWCAP2_SME_SF8DP4	(1UL << 61)
199 #define	HWCAP2_SME_SF8DP2	(1UL << 62)
200 #define	HWCAP2_POE		(1UL << 63)
201 
202 #ifdef COMPAT_FREEBSD32
203 /* ARM HWCAP */
204 #define	HWCAP32_HALF		0x00000002	/* Always set.               */
205 #define	HWCAP32_THUMB		0x00000004	/* Always set.               */
206 #define	HWCAP32_FAST_MULT	0x00000010	/* Always set.               */
207 #define	HWCAP32_VFP		0x00000040
208 #define	HWCAP32_EDSP		0x00000080	/* Always set.               */
209 #define	HWCAP32_NEON		0x00001000
210 #define	HWCAP32_VFPv3		0x00002000
211 #define	HWCAP32_TLS		0x00008000	/* Always set.               */
212 #define	HWCAP32_VFPv4		0x00010000
213 #define	HWCAP32_IDIVA		0x00020000	/* Always set.               */
214 #define	HWCAP32_IDIVT		0x00040000	/* Always set.               */
215 #define	HWCAP32_VFPD32		0x00080000	/* Always set.               */
216 #define	HWCAP32_LPAE		0x00100000	/* Always set.               */
217 
218 #define HWCAP32_DEFAULT \
219    (HWCAP32_HALF | HWCAP32_THUMB | HWCAP32_FAST_MULT | HWCAP32_EDSP |\
220     HWCAP32_TLS | HWCAP32_IDIVA | HWCAP32_IDIVT | HWCAP32_VFPD32 |   \
221     HWCAP32_LPAE)
222 
223 /* ARM HWCAP2 */
224 #define	HWCAP32_2_AES		0x00000001
225 #define	HWCAP32_2_PMULL		0x00000002
226 #define	HWCAP32_2_SHA1		0x00000004
227 #define	HWCAP32_2_SHA2		0x00000008
228 #define	HWCAP32_2_CRC32		0x00000010
229 #endif
230 
231 #endif /* !_MACHINE_ELF_H_ */
232 
233 #endif /* !__arm__ */
234