1b9dea67fSPeter Grehan /*- 24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 3e6209940SPedro F. Giffuni * 4b9dea67fSPeter Grehan * Copyright (c) 1999, 2000 John D. Polstra. 5b9dea67fSPeter Grehan * All rights reserved. 6b9dea67fSPeter Grehan * 7b9dea67fSPeter Grehan * Redistribution and use in source and binary forms, with or without 8b9dea67fSPeter Grehan * modification, are permitted provided that the following conditions 9b9dea67fSPeter Grehan * are met: 10b9dea67fSPeter Grehan * 1. Redistributions of source code must retain the above copyright 11b9dea67fSPeter Grehan * notice, this list of conditions and the following disclaimer. 12b9dea67fSPeter Grehan * 2. Redistributions in binary form must reproduce the above copyright 13b9dea67fSPeter Grehan * notice, this list of conditions and the following disclaimer in the 14b9dea67fSPeter Grehan * documentation and/or other materials provided with the distribution. 15b9dea67fSPeter Grehan * 16b9dea67fSPeter Grehan * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17b9dea67fSPeter Grehan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18b9dea67fSPeter Grehan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19b9dea67fSPeter Grehan * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20b9dea67fSPeter Grehan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21b9dea67fSPeter Grehan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22b9dea67fSPeter Grehan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23b9dea67fSPeter Grehan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24b9dea67fSPeter Grehan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25b9dea67fSPeter Grehan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26b9dea67fSPeter Grehan * SUCH DAMAGE. 27b9dea67fSPeter Grehan * 28b9dea67fSPeter Grehan * $FreeBSD$ 29b9dea67fSPeter Grehan */ 30b9dea67fSPeter Grehan 31b9dea67fSPeter Grehan #ifndef RTLD_MACHDEP_H 32b9dea67fSPeter Grehan #define RTLD_MACHDEP_H 1 33b9dea67fSPeter Grehan 346d5d786fSAlexander Kabaev #include <sys/types.h> 35b9dea67fSPeter Grehan #include <machine/atomic.h> 368bcdb144SJohn Baldwin #include <machine/tls.h> 37b9dea67fSPeter Grehan 38b9dea67fSPeter Grehan struct Struct_Obj_Entry; 39b9dea67fSPeter Grehan 40b9dea67fSPeter Grehan /* Return the address of the .dynamic section in the dynamic linker. */ 41b9dea67fSPeter Grehan #define rtld_dynamic(obj) (&_DYNAMIC) 42b9dea67fSPeter Grehan 43b9dea67fSPeter Grehan Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target, 44e35ddbe4SKonstantin Belousov const struct Struct_Obj_Entry *defobj, const struct Struct_Obj_Entry *obj, 45b9dea67fSPeter Grehan const Elf_Rel *rel); 46903e0ffdSAlex Richardson void reloc_non_plt_self(Elf_Dyn *dynp, Elf_Addr relocbase); 47b9dea67fSPeter Grehan 48b9dea67fSPeter Grehan #define make_function_pointer(def, defobj) \ 49b9dea67fSPeter Grehan ((defobj)->relocbase + (def)->st_value) 50b9dea67fSPeter Grehan 51b9dea67fSPeter Grehan #define call_initfini_pointer(obj, target) \ 52b9dea67fSPeter Grehan (((InitFunc)(target))()) 53b9dea67fSPeter Grehan 5483aa9cc0SKonstantin Belousov #define call_init_pointer(obj, target) \ 5583aa9cc0SKonstantin Belousov (((InitArrFunc)(target))(main_argc, main_argv, environ)) 5683aa9cc0SKonstantin Belousov 5757462f8fSBrandon Bergren extern u_long cpu_features; /* r3 */ 5857462f8fSBrandon Bergren extern u_long cpu_features2; /* r4 */ 5957462f8fSBrandon Bergren /* r5-10: ifunc resolver parameters reserved for future assignment. */ 604352999eSKonstantin Belousov #define call_ifunc_resolver(ptr) \ 6157462f8fSBrandon Bergren (((Elf_Addr (*)(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, \ 6257462f8fSBrandon Bergren uint32_t, uint32_t, uint32_t))ptr)((uint32_t)cpu_features, \ 6357462f8fSBrandon Bergren (uint32_t)cpu_features2, 0, 0, 0, 0, 0, 0)) 644352999eSKonstantin Belousov 65b9dea67fSPeter Grehan /* 66b9dea67fSPeter Grehan * PLT functions. Not really correct prototypes, but the 67b9dea67fSPeter Grehan * symbol values are needed. 68b9dea67fSPeter Grehan */ 694f2730f7SNathan Whitehorn void _rtld_powerpc_pltlongresolve(void); 70b9dea67fSPeter Grehan void _rtld_powerpc_pltresolve(void); 71b9dea67fSPeter Grehan void _rtld_powerpc_pltcall(void); 72b9dea67fSPeter Grehan 736c2a9753SSuleiman Souhlal /* 746c2a9753SSuleiman Souhlal * TLS 756c2a9753SSuleiman Souhlal */ 766c2a9753SSuleiman Souhlal 77fca32c74SDoug Rabson #define round(size, align) \ 78fca32c74SDoug Rabson (((size) + (align) - 1) & ~((align) - 1)) 79e5c3405cSKonstantin Belousov #define calculate_first_tls_offset(size, align, offset) \ 80953cba36SAndreas Tobler TLS_TCB_SIZE 81e5c3405cSKonstantin Belousov #define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \ 82fca32c74SDoug Rabson round(prev_offset + prev_size, align) 8317fb2856SBrooks Davis #define calculate_tls_post_size(align) 0 84fca32c74SDoug Rabson 85fca32c74SDoug Rabson typedef struct { 86fca32c74SDoug Rabson unsigned long ti_module; 87fca32c74SDoug Rabson unsigned long ti_offset; 88fca32c74SDoug Rabson } tls_index; 89fca32c74SDoug Rabson 90fca32c74SDoug Rabson extern void *__tls_get_addr(tls_index* ti); 91fca32c74SDoug Rabson 9257462f8fSBrandon Bergren extern void powerpc_abi_variant_hook(Elf_Auxinfo **); 9357462f8fSBrandon Bergren #define md_abi_variant_hook(x) powerpc_abi_variant_hook(x) 948fd53f45SWarner Losh 95b9dea67fSPeter Grehan #endif 96