1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
|
/* $NetBSD: elf_machdep.h,v 1.4 2018/10/12 01:28:58 ryo Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Matt Thomas of 3am Software Foundry.
*
* 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 NETBSD FOUNDATION, INC. 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 FOUNDATION 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 _AARCH64_ELF_MACHDEP_H_
#define _AARCH64_ELF_MACHDEP_H_
#ifdef __aarch64__
#if defined(__AARCH64EB__)
#define ELF64_MACHDEP_ENDIANNESS ELFDATA2MSB
#define ELF32_MACHDEP_ENDIANNESS ELFDATA2MSB
#else
#define ELF64_MACHDEP_ENDIANNESS ELFDATA2LSB
#define ELF32_MACHDEP_ENDIANNESS ELFDATA2LSB
#endif
/* Processor specific flags for the ELF header e_flags field. */
#define EF_ARM_RELEXEC 0x00000001
#define EF_ARM_HASENTRY 0x00000002
#define EF_ARM_INTERWORK 0x00000004 /* GNU binutils 000413 */
#define EF_ARM_SYMSARESORTED 0x00000004 /* ARM ELF A08 */
#define EF_ARM_APCS_26 0x00000008 /* GNU binutils 000413 */
#define EF_ARM_DYNSYMSUSESEGIDX 0x00000008 /* ARM ELF B01 */
#define EF_ARM_APCS_FLOAT 0x00000010 /* GNU binutils 000413 */
#define EF_ARM_MAPSYMSFIRST 0x00000010 /* ARM ELF B01 */
#define EF_ARM_PIC 0x00000020
#define EF_ARM_ALIGN8 0x00000040 /* 8-bit structure alignment. */
#define EF_ARM_NEW_ABI 0x00000080
#define EF_ARM_OLD_ABI 0x00000100
#define EF_ARM_SOFT_FLOAT 0x00000200
#define EF_ARM_BE8 0x00800000
#define EF_ARM_EABIMASK 0xff000000
#define EF_ARM_EABI_VER1 0x01000000
#define EF_ARM_EABI_VER2 0x02000000
#define EF_ARM_EABI_VER3 0x03000000
#define EF_ARM_EABI_VER4 0x04000000
#define EF_ARM_EABI_VER5 0x05000000
#define ELF32_MACHDEP_ID_CASES \
case EM_ARM: \
break;
#define ELF64_MACHDEP_ID_CASES \
case EM_AARCH64: \
break;
#define ELF64_MACHDEP_ID EM_AARCH64
#define ELF32_MACHDEP_ID EM_ARM
#define KERN_ELFSIZE 64
#define ARCH_ELFSIZE 64 /* MD native binary size */
/* Processor specific relocation types */
#define R_AARCH64_NONE 0
#define R_AARCH64_NONE2 256
#define R_AARCH64_ABS64 257 /* S + A */
#define R_AARCH64_ABS32 258 /* S + A */
#define R_AARCH64_ABS16 259 /* S + A */
#define R_AARCH64_PREL64 260 /* S + A - P */
#define R_AARCH64_PREL32 261 /* S + A - P */
#define R_AARCH64_PREL16 262 /* S + A - P */
#define R_AARCH64_MOVW_UABS_G0 263 /* S + A [bits 0..15] */
#define R_AARCH64_MOVW_UABS_G0_NC 264 /* S + A [bits 0..15] */
#define R_AARCH64_MOVW_UABS_G1 265 /* S + A [bits 16..31] */
#define R_AARCH64_MOVW_UABS_G1_NC 266 /* S + A [bits 16..31] */
#define R_AARCH64_MOVW_UABS_G2 267 /* S + A [bits 32..47] */
#define R_AARCH64_MOVW_UABS_G2_NC 268 /* S + A [bits 32..47] */
#define R_AARCH64_MOVW_UABS_G3 269 /* S + A [bits 48..63] */
#define R_AARCH64_MOVW_SABS_G0 270 /* S + A [bits 0..15] */
#define R_AARCH64_MOVW_SABS_G1 271 /* S + A [bits 16..31] */
#define R_AARCH64_MOVW_SABS_G2 272 /* S + A [bits 32..47] */
#define R_AARCH64_LD_PREL_LO19 273 /* S + A - P */
#define R_AARCH64_ADR_PREL_LO21 274 /* S + A - P */
#define R_AARCH64_ADR_PREL_PG_HI21 275 /* Page(S + A) - Page(P) */
#define R_AARCH64_ADR_PREL_PG_HI21_NC 276 /* Page(S + A) - Page(P) */
#define R_AARCH64_ADD_ABS_LO12_NC 277 /* S + A */
#define R_AARCH64_LDST8_ABS_LO12_NC 278 /* S + A */
#define R_AARCH_TSTBR14 279 /* S + A - P */
#define R_AARCH_CONDBR19 281 /* S + A - P */
#define R_AARCH_JUMP26 282 /* S + A - P */
#define R_AARCH_CALL26 283 /* S + A - P */
#define R_AARCH_LDST16_ABS_LO12_NC 284 /* S + A */
#define R_AARCH_LDST32_ABS_LO12_NC 285 /* S + A */
#define R_AARCH_LDST64_ABS_LO12_NC 286 /* S + A */
#define R_AARCH64_MOVW_PREL_G0 287 /* S + A - P */
#define R_AARCH64_MOVW_PREL_G0_NC 288 /* S + A - P */
#define R_AARCH64_MOVW_PREL_G1 289 /* S + A - P */
#define R_AARCH64_MOVW_PREL_G1_NC 290 /* S + A - P */
#define R_AARCH64_MOVW_PREL_G2 291 /* S + A - P */
#define R_AARCH64_MOVW_PREL_G2_NC 292 /* S + A - P */
#define R_AARCH64_MOVW_PREL_G3 293 /* S + A - P */
#define R_AARCH64_LDST128_ABS_LO12_NC 299 /* S + A */
#define R_AARCH64_MOVW_GOTOFF_G0 300 /* G(GDAT(S + A)) - GOT */
#define R_AARCH64_MOVW_GOTOFF_G0_NC 301 /* G(GDAT(S + A)) - GOT */
#define R_AARCH64_MOVW_GOTOFF_G1 302 /* G(GDAT(S + A)) - GOT */
#define R_AARCH64_MOVW_GOTOFF_G1_NC 303 /* G(GDAT(S + A)) - GOT */
#define R_AARCH64_MOVW_GOTOFF_G2 304 /* G(GDAT(S + A)) - GOT */
#define R_AARCH64_MOVW_GOTOFF_G2_NC 305 /* G(GDAT(S + A)) - GOT */
#define R_AARCH64_MOVW_GOTOFF_G3 306 /* G(GDAT(S + A)) - GOT */
#define R_AARCH64_GOTREL64 307 /* S + A - GOT */
#define R_AARCH64_GOTREL32 308 /* S + A - GOT */
#define R_AARCH64_GOT_LD_PREL19 309 /* G(GDAT(S + A)) - P */
#define R_AARCH64_LD64_GOTOFF_LO15 310 /* G(GDAT(S + A)) - GOT */
#define R_AARCH64_ADR_GOT_PAGE 311 /* Page(G(GDAT(S + A))) - Page(GOT) */
#define R_AARCH64_LD64_GOT_LO12_NC 312 /* G(GDAT(S + A)) */
#define R_AARCH64_LD64_GOTPAGE_LO15 313 /* G(GDAT(S + A)) - Page(GOT) */
#define R_AARCH64_TLSGD_ADR_PREL21 512 /* G(GTLSIDX(S,A)) - P */
#define R_AARCH64_TLSGD_ADR_PAGE21 513 /* Page(G(GTLSIDX(S,A))) - Page(P) */
#define R_AARCH64_TLSGD_ADD_LO12_NC 514 /* G(GTLSIDX(S,A)) */
#define R_AARCH64_TLSGD_MOVW_G1 515 /* G(GTLSIDX(S,A)) - GOT */
#define R_AARCH64_TLSGD_MOVW_G0_NV 516 /* G(GTLSIDX(S,A)) - GOT */
#define R_AARCH64_TLSLD_ADR_PREL21 517 /* G(GLDM(S,A)) - P */
#define R_AARCH64_TLSLD_ADR_PAGE21 518 /* Page(G(GLDM(S))) - Page(P) */
#define R_AARCH64_TLSLD_ADD_LO12_NC 519 /* G(GLDM(S)) */
#define R_AARCH64_TLSLD_MOVW_G1 520 /* G(GLDM(S)) - GOT */
#define R_AARCH64_TLSLD_MOVW_G0_NC 521 /* G(GLDM(S)) - GOT */
#define R_AARCH64_TLSLD_LD_PREL21 522 /* G(GLDM(S)) - P */
#define R_AARCH64_TLSLD_MOVW_DTPREL_G2 523 /* DTPREL(S+A) */
#define R_AARCH64_TLSLD_MOVW_DTPREL_G1 524 /* DTPREL(S+A) */
#define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC 525 /* DTPREL(S+A) */
#define R_AARCH64_TLSLD_MOVW_DTPREL_G0 526 /* DTPREL(S+A) */
#define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC 528 /* DTPREL(S+A) */
#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528 /* DTPREL(S+A) */
#define R_AARCH64_TLSLD_ADD_DTPREL_HI12 528 /* DTPREL(S+A) */
#define R_AARCH64_TLSLD_ADD_DTPREL_LO12 529 /* DTPREL(S+A) */
#define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC 530 /* DTPREL(S+A) */
#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12 531 /* DTPREL(S+A) */
#define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC 532 /* DTPREL(S+A) */
#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12 533 /* DTPREL(S+A) */
#define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC 534 /* DTPREL(S+A) */
#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12 535 /* DTPREL(S+A) */
#define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC 536 /* DTPREL(S+A) */
#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12 537 /* DTPREL(S+A) */
#define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC 538 /* DTPREL(S+A) */
#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1 539 /* G(GTPREL(S+A)) - GOT */
#define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540 /* G(GTPREL(S+A)) - GOT */
#define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541 /* Page(G(GTPREL(S+A))) - Page(P) */
#define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC 542 /* G(GTPREL(S+A)) */
#define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19 543 /* G(GTPREL(S+A)) - P */
#define R_AARCH64_TLSLE_MOVW_TPREL_G2 544 /* TPREL(S+A) */
#define R_AARCH64_MOVW_TPREL_G1 545 /* TPREL(S+A) */
#define R_AARCH64_MOVW_TPREL_G1_NC 546 /* TPREL(S+A) */
#define R_AARCH64_MOVW_TPREL_G0 547 /* TPREL(S+A) */
#define R_AARCH64_MOVW_TPREL_G0_NC 548 /* TPREL(S+A) */
#define R_AARCH64_ADD_TPREL_HI12 549 /* TPREL(S+A) */
#define R_AARCH64_ADD_TPREL_LO12 550 /* TPREL(S+A) */
#define R_AARCH64_ADD_TPREL_LO12_NC 551 /* TPREL(S+A) */
#define R_AARCH64_LDST8_TPREL_LO12 552 /* TPREL(S+A) */
#define R_AARCH64_LDST8_TPREL_LO12_NC 553 /* TPREL(S+A) */
#define R_AARCH64_LDST16_TPREL_LO12 554 /* TPREL(S+A) */
#define R_AARCH64_LDST16_TPREL_LO12_NC 555 /* TPREL(S+A) */
#define R_AARCH64_LDST32_TPREL_LO12 556 /* TPREL(S+A) */
#define R_AARCH64_LDST32_TPREL_LO12_NC 557 /* TPREL(S+A) */
#define R_AARCH64_LDST64_TPREL_LO12 558 /* TPREL(S+A) */
#define R_AARCH64_LDST64_TPREL_LO12_NC 559 /* TPREL(S+A) */
#define R_AARCH64_TLSDESC_LD_PREL19 560 /* G(GTLSDESC(S+A)) - P */
#define R_AARCH64_TLSDESC_LD_PREL21 561 /* G(GTLSDESC(S+A)) - P */
#define R_AARCH64_TLSDESC_LD_PAGE21 562 /* Page(G(GTLSDESC(S+A))) - Page(P) */
#define R_AARCH64_TLSDESC_LD64_LO12 563 /* G(GTLSDESC(S+A)) */
#define R_AARCH64_TLSDESC_ADD_LO12 564 /* G(GTLSDESC(S+A)) */
#define R_AARCH64_TLSDESC_OFF_G1 565 /* G(GTLSDESC(S+A)) - GOT */
#define R_AARCH64_TLSDESC_OFF_G0_NC 566 /* G(GTLSDESC(S+A)) - GOT */
#define R_AARCH64_TLSDESC_LDR 567 /* */
#define R_AARCH64_TLSDESC_ADD 568 /* */
#define R_AARCH64_TLSDESC_CALL 569 /* */
#define R_AARCH64_TLSLE_LDST128_TPREL_LO12 570 /* TPREL(S+A) */
#define R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC 571 /* TPREL(S+A) */
#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12 572 /* DTPREL(S+A) */
#define R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC 572 /* DTPREL(S+A) */
/* Dynamic Relocations */
#define R_AARCH64_P32_COPY 180
#define R_AARCH64_P32_GLOB_DAT 181 /* S + A */
#define R_AARCH64_P32_JUMP_SLOT 182 /* S + A */
#define R_AARCH64_P32_RELATIVE 183 /* Delta(S) + A */
#define R_AARCH64_P32_TLS_DTPREL 184 /* DTPREL(S+A) */
#define R_AARCH64_P32_TLS_DTPMOD 185 /* LBM(S) */
#define R_AARCH64_P32_TLS_TPREL 186 /* TPREL(S+A) */
#define R_AARCH64_P32_TLSDESC 187 /* TLSDESC(S+A) */
#define R_AARCH64_P32_IRELATIVE 188 /* Indirect(Delta(S) + A) */
#define R_AARCH64_COPY 1024
#define R_AARCH64_GLOB_DAT 1025 /* S + A */
#define R_AARCH64_JUMP_SLOT 1026 /* S + A */
#define R_AARCH64_RELATIVE 1027 /* Delta(S) + A */
#define R_AARCH64_TLS_DTPREL64 1028 /* DTPREL(S+A) */
#define R_AARCH64_TLS_DTPMOD64 1029 /* LBM(S) */
#define R_AARCH64_TLS_TPREL64 1030 /* TPREL(S+A) */
#define R_AARCH64_TLSDESC 1031 /* TLSDESC(S+A) */
#define R_AARCH64_IRELATIVE 1032 /* Indirect(Delta(S) + A) */
#define R_TYPE(name) R_AARCH64_ ## name
#define R_TLS_TYPE(name) R_AARCH64_ ## name ## 64
/* Processor specific program header types */
#define PT_AARCH64_ARCHEXT (PT_LOPROC + 0)
#define PT_AARCH64_UNWIND (PT_LOPROC + 1)
/* Processor specific section header flags */
#define SHF_ENTRYSECT 0x10000000
#define SHF_COMDEF 0x80000000
#define SHT_AARCH64_ATTRIBUTES (SHT_LOPROC + 3)
#ifdef _KERNEL
#ifdef ELFSIZE
#define ELF_MD_PROBE_FUNC ELFNAME2(aarch64_netbsd,probe)
#endif
struct exec_package;
int aarch64_netbsd_elf64_probe(struct lwp *, struct exec_package *, void *,
char *, vaddr_t *);
int aarch64_netbsd_elf32_probe(struct lwp *, struct exec_package *, void *,
char *, vaddr_t *);
#endif
#elif defined(__arm__)
#include <arm/elf_machdep.h>
#endif
#endif /* _AARCH64_ELF_MACHDEP_H_ */
|