1280903Sandrew/*- 2280903Sandrew * Copyright (c) 1999, 2000 John D. Polstra. 3280903Sandrew * Copyright (c) 2014 the FreeBSD Foundation 4280903Sandrew * All rights reserved. 5280903Sandrew * 6280903Sandrew * Portions of this software were developed by Andrew Turner 7280903Sandrew * under sponsorship from the FreeBSD Foundation. 8280903Sandrew * 9280903Sandrew * Redistribution and use in source and binary forms, with or without 10280903Sandrew * modification, are permitted provided that the following conditions 11280903Sandrew * are met: 12280903Sandrew * 1. Redistributions of source code must retain the above copyright 13280903Sandrew * notice, this list of conditions and the following disclaimer. 14280903Sandrew * 2. Redistributions in binary form must reproduce the above copyright 15280903Sandrew * notice, this list of conditions and the following disclaimer in the 16280903Sandrew * documentation and/or other materials provided with the distribution. 17280903Sandrew * 18280903Sandrew * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 19280903Sandrew * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 20280903Sandrew * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 21280903Sandrew * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 22280903Sandrew * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23280903Sandrew * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24280903Sandrew * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25280903Sandrew * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26280903Sandrew * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27280903Sandrew * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28280903Sandrew * SUCH DAMAGE. 29280903Sandrew * 30280903Sandrew * $FreeBSD: stable/11/libexec/rtld-elf/aarch64/rtld_machdep.h 316135 2017-03-29 11:03:08Z kib $ 31280903Sandrew */ 32280903Sandrew 33280903Sandrew#ifndef RTLD_MACHDEP_H 34280903Sandrew#define RTLD_MACHDEP_H 1 35280903Sandrew 36280903Sandrew#include <sys/types.h> 37280903Sandrew#include <machine/atomic.h> 38280903Sandrew 39280903Sandrewstruct Struct_Obj_Entry; 40280903Sandrew 41280903Sandrew/* Return the address of the .dynamic section in the dynamic linker. */ 42280903Sandrew#define rtld_dynamic(obj) \ 43280903Sandrew({ \ 44280903Sandrew Elf_Addr _dynamic_addr; \ 45280903Sandrew asm volatile("adr %0, _DYNAMIC" : "=&r"(_dynamic_addr)); \ 46280903Sandrew (const Elf_Dyn *)_dynamic_addr; \ 47280903Sandrew}) 48280903Sandrew 49280903SandrewElf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target, 50316135Skib const struct Struct_Obj_Entry *defobj, const struct Struct_Obj_Entry *obj, 51316135Skib const Elf_Rel *rel); 52280903Sandrew 53280903Sandrew#define make_function_pointer(def, defobj) \ 54280903Sandrew ((defobj)->relocbase + (def)->st_value) 55280903Sandrew 56280903Sandrew#define call_initfini_pointer(obj, target) \ 57280903Sandrew (((InitFunc)(target))()) 58280903Sandrew 59280903Sandrew#define call_init_pointer(obj, target) \ 60280903Sandrew (((InitArrFunc)(target))(main_argc, main_argv, environ)) 61280903Sandrew 62309045Skib#define call_ifunc_resolver(ptr) \ 63309045Skib (((Elf_Addr (*)(void))ptr)()) 64309045Skib 65309045Skib#define round(size, align) \ 66280903Sandrew (((size) + (align) - 1) & ~((align) - 1)) 67280903Sandrew#define calculate_first_tls_offset(size, align) \ 68287370Sandrew round(16, align) 69280903Sandrew#define calculate_tls_offset(prev_offset, prev_size, size, align) \ 70287370Sandrew round(prev_offset + prev_size, align) 71280903Sandrew#define calculate_tls_end(off, size) ((off) + (size)) 72280903Sandrew 73287370Sandrew#define TLS_TCB_SIZE 16 74280903Sandrewtypedef struct { 75280903Sandrew unsigned long ti_module; 76280903Sandrew unsigned long ti_offset; 77280903Sandrew} tls_index; 78280903Sandrew 79280903Sandrewextern void *__tls_get_addr(tls_index *ti); 80280903Sandrew 81280903Sandrew#define RTLD_DEFAULT_STACK_PF_EXEC PF_X 82280903Sandrew#define RTLD_DEFAULT_STACK_EXEC PROT_EXEC 83280903Sandrew 84293066Simp#define md_abi_variant_hook(x) 85293066Simp 86280903Sandrew#endif 87