xref: /freebsd/sys/arm64/include/elf.h (revision b5a3a89c50671a1ad29e7c43fe15e7b16feac239)
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  * $FreeBSD$
27  */
28 
29 #ifdef __arm__
30 #include <arm/elf.h>
31 #else /* !__arm__ */
32 
33 #ifndef	_MACHINE_ELF_H_
34 #define	_MACHINE_ELF_H_
35 
36 /*
37  * ELF definitions for the AArch64 architecture.
38  */
39 
40 #include <sys/elf32.h>	/* Definitions common to all 32 bit architectures. */
41 #include <sys/elf64.h>	/* Definitions common to all 64 bit architectures. */
42 
43 #ifndef __ELF_WORD_SIZE
44 #define	__ELF_WORD_SIZE	64	/* Used by <sys/elf_generic.h> */
45 #endif
46 
47 #include <sys/elf_generic.h>
48 
49 /*
50  * Auxiliary vector entries for passing information to the interpreter.
51  */
52 
53 typedef struct {	/* Auxiliary vector entry on initial stack */
54 	int	a_type;			/* Entry type. */
55 	union {
56 		int	a_val;		/* Integer value. */
57 	} a_un;
58 } Elf32_Auxinfo;
59 
60 typedef struct {	/* Auxiliary vector entry on initial stack */
61 	long	a_type;			/* Entry type. */
62 	union {
63 		long	a_val;		/* Integer value. */
64 		void	*a_ptr;		/* Address. */
65 		void	(*a_fcn)(void);	/* Function pointer (not used). */
66 	} a_un;
67 } Elf64_Auxinfo;
68 
69 __ElfType(Auxinfo);
70 
71 #ifdef _MACHINE_ELF_WANT_32BIT
72 #define	ELF_ARCH	EM_ARM
73 #else
74 #define	ELF_ARCH	EM_AARCH64
75 #endif
76 
77 #define	ELF_MACHINE_OK(x) ((x) == (ELF_ARCH))
78 
79 /* Define "machine" characteristics */
80 #if __ELF_WORD_SIZE == 64
81 #define	ELF_TARG_CLASS	ELFCLASS64
82 #define	ELF_TARG_DATA	ELFDATA2LSB
83 #define	ELF_TARG_MACH	EM_AARCH64
84 #define	ELF_TARG_VER	1
85 #else
86 #define	ELF_TARG_CLASS	ELFCLASS32
87 #define	ELF_TARG_DATA	ELFDATA2LSB
88 #define	ELF_TARG_MACH	EM_ARM
89 #define	ELF_TARG_VER	1
90 #endif
91 
92 #if __ELF_WORD_SIZE == 32
93 #define	ET_DYN_LOAD_ADDR 0x01001000
94 #else
95 #define	ET_DYN_LOAD_ADDR 0x100000
96 #endif
97 
98 /* HWCAP */
99 #define	HWCAP_FP		0x00000001
100 #define	HWCAP_ASIMD		0x00000002
101 #define	HWCAP_EVTSTRM		0x00000004
102 #define	HWCAP_AES		0x00000008
103 #define	HWCAP_PMULL		0x00000010
104 #define	HWCAP_SHA1		0x00000020
105 #define	HWCAP_SHA2		0x00000040
106 #define	HWCAP_CRC32		0x00000080
107 #define	HWCAP_ATOMICS		0x00000100
108 #define	HWCAP_FPHP		0x00000200
109 #define	HWCAP_ASIMDHP		0x00000400
110 /*
111  * XXX: The following bits (from CPUID to FLAGM) were originally incorrect,
112  * but later changed to match the Linux definitions. No compatibility code is
113  * provided, as the fix was expected to result in near-zero fallout.
114  */
115 #define	HWCAP_CPUID		0x00000800
116 #define	HWCAP_ASIMDRDM		0x00001000
117 #define	HWCAP_JSCVT		0x00002000
118 #define	HWCAP_FCMA		0x00004000
119 #define	HWCAP_LRCPC		0x00008000
120 #define	HWCAP_DCPOP		0x00010000
121 #define	HWCAP_SHA3		0x00020000
122 #define	HWCAP_SM3		0x00040000
123 #define	HWCAP_SM4		0x00080000
124 #define	HWCAP_ASIMDDP		0x00100000
125 #define	HWCAP_SHA512		0x00200000
126 #define	HWCAP_SVE		0x00400000
127 #define	HWCAP_ASIMDFHM		0x00800000
128 #define	HWCAP_DIT		0x01000000
129 #define	HWCAP_USCAT		0x02000000
130 #define	HWCAP_ILRCPC		0x04000000
131 #define	HWCAP_FLAGM		0x08000000
132 #define	HWCAP_SSBS		0x10000000
133 #define	HWCAP_SB		0x20000000
134 #define	HWCAP_PACA		0x40000000
135 #define	HWCAP_PACG		0x80000000
136 
137 /* HWCAP2 */
138 #define	HWCAP2_DCPODP		0x00000001
139 #define	HWCAP2_SVE2		0x00000002
140 #define	HWCAP2_SVEAES		0x00000004
141 #define	HWCAP2_SVEPMULL		0x00000008
142 #define	HWCAP2_SVEBITPERM	0x00000010
143 #define	HWCAP2_SVESHA3		0x00000020
144 #define	HWCAP2_SVESM4		0x00000040
145 #define	HWCAP2_FLAGM2		0x00000080
146 #define	HWCAP2_FRINT		0x00000100
147 #define	HWCAP2_SVEI8MM		0x00000200
148 #define	HWCAP2_SVEF32MM		0x00000400
149 #define	HWCAP2_SVEF64MM		0x00000800
150 #define	HWCAP2_SVEBF16		0x00001000
151 #define	HWCAP2_I8MM		0x00002000
152 #define	HWCAP2_BF16		0x00004000
153 #define	HWCAP2_DGH		0x00008000
154 #define	HWCAP2_RNG		0x00010000
155 #define	HWCAP2_BTI		0x00020000
156 
157 #ifdef COMPAT_FREEBSD32
158 /* ARM HWCAP */
159 #define	HWCAP32_HALF		0x00000002	/* Always set.               */
160 #define	HWCAP32_THUMB		0x00000004	/* Always set.               */
161 #define	HWCAP32_FAST_MULT	0x00000010	/* Always set.               */
162 #define	HWCAP32_VFP		0x00000040
163 #define	HWCAP32_EDSP		0x00000080	/* Always set.               */
164 #define	HWCAP32_NEON		0x00001000
165 #define	HWCAP32_VFPv3		0x00002000
166 #define	HWCAP32_TLS		0x00008000	/* Always set.               */
167 #define	HWCAP32_VFPv4		0x00010000
168 #define	HWCAP32_IDIVA		0x00020000	/* Always set.               */
169 #define	HWCAP32_IDIVT		0x00040000	/* Always set.               */
170 #define	HWCAP32_VFPD32		0x00080000	/* Always set.               */
171 #define	HWCAP32_LPAE		0x00100000	/* Always set.               */
172 
173 #define HWCAP32_DEFAULT \
174    (HWCAP32_HALF | HWCAP32_THUMB | HWCAP32_FAST_MULT | HWCAP32_EDSP |\
175     HWCAP32_TLS | HWCAP32_IDIVA | HWCAP32_IDIVT | HWCAP32_VFPD32 |   \
176     HWCAP32_LPAE)
177 
178 /* ARM HWCAP2 */
179 #define	HWCAP32_2_AES		0x00000001
180 #define	HWCAP32_2_PMULL		0x00000002
181 #define	HWCAP32_2_SHA1		0x00000004
182 #define	HWCAP32_2_SHA2		0x00000008
183 #define	HWCAP32_2_CRC32		0x00000010
184 #endif
185 
186 #endif /* !_MACHINE_ELF_H_ */
187 
188 #endif /* !__arm__ */
189