Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:24:22

0001 /* $NetBSD: elf_machdep.h,v 1.4 2018/10/12 01:28:58 ryo Exp $ */
0002 
0003 /*-
0004  * Copyright (c) 2014 The NetBSD Foundation, Inc.
0005  * All rights reserved.
0006  *
0007  * This code is derived from software contributed to The NetBSD Foundation
0008  * by Matt Thomas of 3am Software Foundry.
0009  *
0010  * Redistribution and use in source and binary forms, with or without
0011  * modification, are permitted provided that the following conditions
0012  * are met:
0013  * 1. Redistributions of source code must retain the above copyright
0014  *    notice, this list of conditions and the following disclaimer.
0015  * 2. Redistributions in binary form must reproduce the above copyright
0016  *    notice, this list of conditions and the following disclaimer in the
0017  *    documentation and/or other materials provided with the distribution.
0018  *
0019  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
0020  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
0021  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
0022  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
0023  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0024  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0025  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0026  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0027  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0028  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
0029  * POSSIBILITY OF SUCH DAMAGE.
0030  */
0031 
0032 #ifndef _AARCH64_ELF_MACHDEP_H_
0033 #define _AARCH64_ELF_MACHDEP_H_
0034 
0035 #ifdef __aarch64__
0036 
0037 #if defined(__AARCH64EB__)
0038 #define ELF64_MACHDEP_ENDIANNESS    ELFDATA2MSB
0039 #define ELF32_MACHDEP_ENDIANNESS    ELFDATA2MSB
0040 #else
0041 #define ELF64_MACHDEP_ENDIANNESS    ELFDATA2LSB
0042 #define ELF32_MACHDEP_ENDIANNESS    ELFDATA2LSB
0043 #endif
0044 
0045 /* Processor specific flags for the ELF header e_flags field.  */
0046 #define EF_ARM_RELEXEC      0x00000001
0047 #define EF_ARM_HASENTRY     0x00000002
0048 #define EF_ARM_INTERWORK    0x00000004 /* GNU binutils 000413 */
0049 #define EF_ARM_SYMSARESORTED    0x00000004 /* ARM ELF A08 */
0050 #define EF_ARM_APCS_26      0x00000008 /* GNU binutils 000413 */
0051 #define EF_ARM_DYNSYMSUSESEGIDX 0x00000008 /* ARM ELF B01 */
0052 #define EF_ARM_APCS_FLOAT   0x00000010 /* GNU binutils 000413 */
0053 #define EF_ARM_MAPSYMSFIRST 0x00000010 /* ARM ELF B01 */
0054 #define EF_ARM_PIC      0x00000020
0055 #define EF_ARM_ALIGN8       0x00000040 /* 8-bit structure alignment.  */
0056 #define EF_ARM_NEW_ABI      0x00000080
0057 #define EF_ARM_OLD_ABI      0x00000100
0058 #define EF_ARM_SOFT_FLOAT   0x00000200
0059 #define EF_ARM_BE8      0x00800000
0060 #define EF_ARM_EABIMASK     0xff000000
0061 #define EF_ARM_EABI_VER1    0x01000000
0062 #define EF_ARM_EABI_VER2    0x02000000
0063 #define EF_ARM_EABI_VER3    0x03000000
0064 #define EF_ARM_EABI_VER4    0x04000000
0065 #define EF_ARM_EABI_VER5    0x05000000
0066 
0067 #define ELF32_MACHDEP_ID_CASES                      \
0068         case EM_ARM:                        \
0069             break;
0070 
0071 #define ELF64_MACHDEP_ID_CASES                      \
0072         case EM_AARCH64:                    \
0073             break;
0074 
0075 #define ELF64_MACHDEP_ID    EM_AARCH64
0076 #define ELF32_MACHDEP_ID    EM_ARM
0077 
0078 #define KERN_ELFSIZE        64
0079 #define ARCH_ELFSIZE        64  /* MD native binary size */
0080 
0081 /* Processor specific relocation types */
0082 
0083 #define R_AARCH64_NONE          0
0084 #define R_AARCH64_NONE2         256
0085 
0086 #define R_AARCH64_ABS64         257 /* S + A */
0087 #define R_AARCH64_ABS32         258 /* S + A */
0088 #define R_AARCH64_ABS16         259 /* S + A */
0089 #define R_AARCH64_PREL64        260 /* S + A - P */
0090 #define R_AARCH64_PREL32        261 /* S + A - P */
0091 #define R_AARCH64_PREL16        262 /* S + A - P */
0092 #define R_AARCH64_MOVW_UABS_G0      263 /* S + A [bits 0..15] */
0093 #define R_AARCH64_MOVW_UABS_G0_NC   264 /* S + A [bits 0..15] */
0094 #define R_AARCH64_MOVW_UABS_G1      265 /* S + A [bits 16..31] */
0095 #define R_AARCH64_MOVW_UABS_G1_NC   266 /* S + A [bits 16..31] */
0096 #define R_AARCH64_MOVW_UABS_G2      267 /* S + A [bits 32..47] */
0097 #define R_AARCH64_MOVW_UABS_G2_NC   268 /* S + A [bits 32..47] */
0098 #define R_AARCH64_MOVW_UABS_G3      269 /* S + A [bits 48..63] */
0099 #define R_AARCH64_MOVW_SABS_G0      270 /* S + A [bits 0..15] */
0100 #define R_AARCH64_MOVW_SABS_G1      271 /* S + A [bits 16..31] */
0101 #define R_AARCH64_MOVW_SABS_G2      272 /* S + A [bits 32..47] */
0102 #define R_AARCH64_LD_PREL_LO19      273 /* S + A - P */
0103 #define R_AARCH64_ADR_PREL_LO21     274 /* S + A - P */
0104 #define R_AARCH64_ADR_PREL_PG_HI21  275 /* Page(S + A) - Page(P) */
0105 #define R_AARCH64_ADR_PREL_PG_HI21_NC   276 /* Page(S + A) - Page(P) */
0106 #define R_AARCH64_ADD_ABS_LO12_NC   277 /* S + A */
0107 #define R_AARCH64_LDST8_ABS_LO12_NC 278 /* S + A */
0108 #define R_AARCH_TSTBR14         279 /* S + A - P */
0109 #define R_AARCH_CONDBR19        281 /* S + A - P */
0110 #define R_AARCH_JUMP26          282 /* S + A - P */
0111 #define R_AARCH_CALL26          283 /* S + A - P */
0112 #define R_AARCH_LDST16_ABS_LO12_NC  284 /* S + A */
0113 #define R_AARCH_LDST32_ABS_LO12_NC  285 /* S + A */
0114 #define R_AARCH_LDST64_ABS_LO12_NC  286 /* S + A */
0115 #define R_AARCH64_MOVW_PREL_G0      287 /* S + A - P */
0116 #define R_AARCH64_MOVW_PREL_G0_NC   288 /* S + A - P */
0117 #define R_AARCH64_MOVW_PREL_G1      289 /* S + A - P */
0118 #define R_AARCH64_MOVW_PREL_G1_NC   290 /* S + A - P */
0119 #define R_AARCH64_MOVW_PREL_G2      291 /* S + A - P */
0120 #define R_AARCH64_MOVW_PREL_G2_NC   292 /* S + A - P */
0121 #define R_AARCH64_MOVW_PREL_G3      293 /* S + A - P */
0122 
0123 #define R_AARCH64_LDST128_ABS_LO12_NC   299 /* S + A */
0124 #define R_AARCH64_MOVW_GOTOFF_G0    300 /* G(GDAT(S + A)) - GOT */
0125 #define R_AARCH64_MOVW_GOTOFF_G0_NC 301 /* G(GDAT(S + A)) - GOT */
0126 #define R_AARCH64_MOVW_GOTOFF_G1    302 /* G(GDAT(S + A)) - GOT */
0127 #define R_AARCH64_MOVW_GOTOFF_G1_NC 303 /* G(GDAT(S + A)) - GOT */
0128 #define R_AARCH64_MOVW_GOTOFF_G2    304 /* G(GDAT(S + A)) - GOT */
0129 #define R_AARCH64_MOVW_GOTOFF_G2_NC 305 /* G(GDAT(S + A)) - GOT */
0130 #define R_AARCH64_MOVW_GOTOFF_G3    306 /* G(GDAT(S + A)) - GOT */
0131 #define R_AARCH64_GOTREL64      307 /* S + A - GOT */
0132 #define R_AARCH64_GOTREL32      308 /* S + A - GOT */
0133 #define R_AARCH64_GOT_LD_PREL19     309 /* G(GDAT(S + A)) - P */
0134 #define R_AARCH64_LD64_GOTOFF_LO15  310 /* G(GDAT(S + A)) - GOT */
0135 #define R_AARCH64_ADR_GOT_PAGE      311 /* Page(G(GDAT(S + A))) - Page(GOT) */
0136 #define R_AARCH64_LD64_GOT_LO12_NC  312 /* G(GDAT(S + A)) */
0137 #define R_AARCH64_LD64_GOTPAGE_LO15 313 /* G(GDAT(S + A)) - Page(GOT) */
0138 
0139 #define R_AARCH64_TLSGD_ADR_PREL21      512 /* G(GTLSIDX(S,A)) - P */
0140 #define R_AARCH64_TLSGD_ADR_PAGE21      513 /* Page(G(GTLSIDX(S,A))) - Page(P) */
0141 #define R_AARCH64_TLSGD_ADD_LO12_NC     514 /* G(GTLSIDX(S,A)) */
0142 #define R_AARCH64_TLSGD_MOVW_G1         515 /* G(GTLSIDX(S,A)) - GOT */
0143 #define R_AARCH64_TLSGD_MOVW_G0_NV      516 /* G(GTLSIDX(S,A)) - GOT */
0144 #define R_AARCH64_TLSLD_ADR_PREL21      517 /* G(GLDM(S,A)) - P */
0145 #define R_AARCH64_TLSLD_ADR_PAGE21      518 /* Page(G(GLDM(S))) - Page(P) */
0146 #define R_AARCH64_TLSLD_ADD_LO12_NC     519 /* G(GLDM(S)) */
0147 #define R_AARCH64_TLSLD_MOVW_G1         520 /* G(GLDM(S)) - GOT */
0148 #define R_AARCH64_TLSLD_MOVW_G0_NC      521 /* G(GLDM(S)) - GOT */
0149 #define R_AARCH64_TLSLD_LD_PREL21       522 /* G(GLDM(S)) - P */
0150 #define R_AARCH64_TLSLD_MOVW_DTPREL_G2      523 /* DTPREL(S+A) */
0151 #define R_AARCH64_TLSLD_MOVW_DTPREL_G1      524 /* DTPREL(S+A) */
0152 #define R_AARCH64_TLSLD_MOVW_DTPREL_G1_NC   525 /* DTPREL(S+A) */
0153 #define R_AARCH64_TLSLD_MOVW_DTPREL_G0      526 /* DTPREL(S+A) */
0154 #define R_AARCH64_TLSLD_MOVW_DTPREL_G0_NC   528 /* DTPREL(S+A) */
0155 #define R_AARCH64_TLSLD_ADD_DTPREL_HI12     528 /* DTPREL(S+A) */
0156 #define R_AARCH64_TLSLD_ADD_DTPREL_HI12     528 /* DTPREL(S+A) */
0157 #define R_AARCH64_TLSLD_ADD_DTPREL_LO12     529 /* DTPREL(S+A) */
0158 #define R_AARCH64_TLSLD_ADD_DTPREL_LO12_NC  530 /* DTPREL(S+A) */
0159 #define R_AARCH64_TLSLD_LDST8_DTPREL_LO12   531 /* DTPREL(S+A) */
0160 #define R_AARCH64_TLSLD_LDST8_DTPREL_LO12_NC    532 /* DTPREL(S+A) */
0161 #define R_AARCH64_TLSLD_LDST16_DTPREL_LO12  533 /* DTPREL(S+A) */
0162 #define R_AARCH64_TLSLD_LDST16_DTPREL_LO12_NC   534 /* DTPREL(S+A) */
0163 #define R_AARCH64_TLSLD_LDST32_DTPREL_LO12  535 /* DTPREL(S+A) */
0164 #define R_AARCH64_TLSLD_LDST32_DTPREL_LO12_NC   536 /* DTPREL(S+A) */
0165 #define R_AARCH64_TLSLD_LDST64_DTPREL_LO12  537 /* DTPREL(S+A) */
0166 #define R_AARCH64_TLSLD_LDST64_DTPREL_LO12_NC   538 /* DTPREL(S+A) */
0167 #define R_AARCH64_TLSIE_MOVW_GOTTPREL_G1    539 /* G(GTPREL(S+A)) - GOT */
0168 #define R_AARCH64_TLSIE_MOVW_GOTTPREL_G0_NC 540 /* G(GTPREL(S+A)) - GOT */
0169 #define R_AARCH64_TLSIE_ADR_GOTTPREL_PAGE21 541 /* Page(G(GTPREL(S+A))) - Page(P) */
0170 #define R_AARCH64_TLSIE_LD64_GOTTPREL_LO12_NC   542 /* G(GTPREL(S+A)) */
0171 #define R_AARCH64_TLSIE_LD_GOTTPREL_PREL19  543 /* G(GTPREL(S+A)) - P */
0172 #define R_AARCH64_TLSLE_MOVW_TPREL_G2   544 /* TPREL(S+A) */
0173 #define R_AARCH64_MOVW_TPREL_G1     545 /* TPREL(S+A) */
0174 #define R_AARCH64_MOVW_TPREL_G1_NC  546 /* TPREL(S+A) */
0175 #define R_AARCH64_MOVW_TPREL_G0     547 /* TPREL(S+A) */
0176 #define R_AARCH64_MOVW_TPREL_G0_NC  548 /* TPREL(S+A) */
0177 #define R_AARCH64_ADD_TPREL_HI12    549 /* TPREL(S+A) */
0178 #define R_AARCH64_ADD_TPREL_LO12    550 /* TPREL(S+A) */
0179 #define R_AARCH64_ADD_TPREL_LO12_NC 551 /* TPREL(S+A) */
0180 #define R_AARCH64_LDST8_TPREL_LO12  552 /* TPREL(S+A) */
0181 #define R_AARCH64_LDST8_TPREL_LO12_NC   553 /* TPREL(S+A) */
0182 #define R_AARCH64_LDST16_TPREL_LO12 554 /* TPREL(S+A) */
0183 #define R_AARCH64_LDST16_TPREL_LO12_NC  555 /* TPREL(S+A) */
0184 #define R_AARCH64_LDST32_TPREL_LO12 556 /* TPREL(S+A) */
0185 #define R_AARCH64_LDST32_TPREL_LO12_NC  557 /* TPREL(S+A) */
0186 #define R_AARCH64_LDST64_TPREL_LO12 558 /* TPREL(S+A) */
0187 #define R_AARCH64_LDST64_TPREL_LO12_NC  559 /* TPREL(S+A) */
0188 #define R_AARCH64_TLSDESC_LD_PREL19 560 /* G(GTLSDESC(S+A)) - P */
0189 #define R_AARCH64_TLSDESC_LD_PREL21 561 /* G(GTLSDESC(S+A)) - P */
0190 #define R_AARCH64_TLSDESC_LD_PAGE21 562 /* Page(G(GTLSDESC(S+A))) - Page(P) */
0191 #define R_AARCH64_TLSDESC_LD64_LO12 563 /* G(GTLSDESC(S+A)) */
0192 #define R_AARCH64_TLSDESC_ADD_LO12  564 /* G(GTLSDESC(S+A)) */
0193 #define R_AARCH64_TLSDESC_OFF_G1    565 /* G(GTLSDESC(S+A)) - GOT */
0194 #define R_AARCH64_TLSDESC_OFF_G0_NC 566 /* G(GTLSDESC(S+A)) - GOT */
0195 #define R_AARCH64_TLSDESC_LDR       567 /* */
0196 #define R_AARCH64_TLSDESC_ADD       568 /* */
0197 #define R_AARCH64_TLSDESC_CALL      569 /* */
0198 #define R_AARCH64_TLSLE_LDST128_TPREL_LO12  570 /* TPREL(S+A) */
0199 #define R_AARCH64_TLSLE_LDST128_TPREL_LO12_NC   571 /* TPREL(S+A) */
0200 #define R_AARCH64_TLSLD_LDST128_DTPREL_LO12 572 /* DTPREL(S+A) */
0201 #define R_AARCH64_TLSLD_LDST128_DTPREL_LO12_NC  572 /* DTPREL(S+A) */
0202 
0203 /* Dynamic Relocations */
0204 #define R_AARCH64_P32_COPY      180
0205 #define R_AARCH64_P32_GLOB_DAT      181 /* S + A */
0206 #define R_AARCH64_P32_JUMP_SLOT     182 /* S + A */
0207 #define R_AARCH64_P32_RELATIVE      183 /* Delta(S) + A */
0208 #define R_AARCH64_P32_TLS_DTPREL    184 /* DTPREL(S+A) */
0209 #define R_AARCH64_P32_TLS_DTPMOD    185 /* LBM(S) */
0210 #define R_AARCH64_P32_TLS_TPREL     186 /* TPREL(S+A) */
0211 #define R_AARCH64_P32_TLSDESC       187 /* TLSDESC(S+A) */
0212 #define R_AARCH64_P32_IRELATIVE     188 /* Indirect(Delta(S) + A) */
0213 
0214 #define R_AARCH64_COPY          1024
0215 #define R_AARCH64_GLOB_DAT      1025    /* S + A */
0216 #define R_AARCH64_JUMP_SLOT     1026    /* S + A */
0217 #define R_AARCH64_RELATIVE      1027    /* Delta(S) + A */
0218 #define R_AARCH64_TLS_DTPREL64      1028    /* DTPREL(S+A) */
0219 #define R_AARCH64_TLS_DTPMOD64      1029    /* LBM(S) */
0220 #define R_AARCH64_TLS_TPREL64       1030    /* TPREL(S+A) */
0221 #define R_AARCH64_TLSDESC       1031    /* TLSDESC(S+A) */
0222 #define R_AARCH64_IRELATIVE     1032    /* Indirect(Delta(S) + A) */
0223 
0224 #define R_TYPE(name)        R_AARCH64_ ## name
0225 #define R_TLS_TYPE(name)    R_AARCH64_ ## name ## 64
0226 
0227 /* Processor specific program header types */
0228 #define PT_AARCH64_ARCHEXT  (PT_LOPROC + 0)
0229 #define PT_AARCH64_UNWIND   (PT_LOPROC + 1)
0230 
0231 /* Processor specific section header flags */
0232 #define SHF_ENTRYSECT       0x10000000
0233 #define SHF_COMDEF      0x80000000
0234 
0235 #define SHT_AARCH64_ATTRIBUTES  (SHT_LOPROC + 3)
0236 
0237 #ifdef _KERNEL
0238 #ifdef ELFSIZE
0239 #define ELF_MD_PROBE_FUNC   ELFNAME2(aarch64_netbsd,probe)
0240 #endif
0241 
0242 struct exec_package;
0243 
0244 int aarch64_netbsd_elf64_probe(struct lwp *, struct exec_package *, void *,
0245     char *, vaddr_t *);
0246 int aarch64_netbsd_elf32_probe(struct lwp *, struct exec_package *, void *,
0247     char *, vaddr_t *);
0248 #endif
0249 
0250 #elif defined(__arm__)
0251 
0252 #include <arm/elf_machdep.h>
0253 
0254 #endif
0255 
0256 #endif /* _AARCH64_ELF_MACHDEP_H_ */