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 29b9dea67fSPeter Grehan #ifndef RTLD_MACHDEP_H 30b9dea67fSPeter Grehan #define RTLD_MACHDEP_H 1 31b9dea67fSPeter Grehan 326d5d786fSAlexander Kabaev #include <sys/types.h> 33b9dea67fSPeter Grehan #include <machine/atomic.h> 348bcdb144SJohn Baldwin #include <machine/tls.h> 35b9dea67fSPeter Grehan 36b9dea67fSPeter Grehan struct Struct_Obj_Entry; 37b9dea67fSPeter Grehan 38b9dea67fSPeter Grehan /* Return the address of the .dynamic section in the dynamic linker. */ 39b9dea67fSPeter Grehan #define rtld_dynamic(obj) (&_DYNAMIC) 40b9dea67fSPeter Grehan 41d8925a5fSAndrew Turner /* No architecture specific notes */ 42d8925a5fSAndrew Turner #define arch_digest_note(obj, note) false 43d8925a5fSAndrew Turner 44b9dea67fSPeter Grehan Elf_Addr reloc_jmpslot(Elf_Addr *where, Elf_Addr target, 45e35ddbe4SKonstantin Belousov const struct Struct_Obj_Entry *defobj, const struct Struct_Obj_Entry *obj, 46b9dea67fSPeter Grehan const Elf_Rel *rel); 47903e0ffdSAlex Richardson void reloc_non_plt_self(Elf_Dyn *dynp, Elf_Addr relocbase); 48b9dea67fSPeter Grehan 49b9dea67fSPeter Grehan #define make_function_pointer(def, defobj) \ 50b9dea67fSPeter Grehan ((defobj)->relocbase + (def)->st_value) 51b9dea67fSPeter Grehan 52b9dea67fSPeter Grehan #define call_initfini_pointer(obj, target) \ 53b9dea67fSPeter Grehan (((InitFunc)(target))()) 54b9dea67fSPeter Grehan 5583aa9cc0SKonstantin Belousov #define call_init_pointer(obj, target) \ 5683aa9cc0SKonstantin Belousov (((InitArrFunc)(target))(main_argc, main_argv, environ)) 5783aa9cc0SKonstantin Belousov 5857462f8fSBrandon Bergren extern u_long cpu_features; /* r3 */ 5957462f8fSBrandon Bergren extern u_long cpu_features2; /* r4 */ 6057462f8fSBrandon Bergren /* r5-10: ifunc resolver parameters reserved for future assignment. */ 614352999eSKonstantin Belousov #define call_ifunc_resolver(ptr) \ 6257462f8fSBrandon Bergren (((Elf_Addr (*)(uint32_t, uint32_t, uint32_t, uint32_t, uint32_t, \ 6357462f8fSBrandon Bergren uint32_t, uint32_t, uint32_t))ptr)((uint32_t)cpu_features, \ 6457462f8fSBrandon Bergren (uint32_t)cpu_features2, 0, 0, 0, 0, 0, 0)) 654352999eSKonstantin Belousov 66b9dea67fSPeter Grehan /* 67b9dea67fSPeter Grehan * PLT functions. Not really correct prototypes, but the 68b9dea67fSPeter Grehan * symbol values are needed. 69b9dea67fSPeter Grehan */ 704f2730f7SNathan Whitehorn void _rtld_powerpc_pltlongresolve(void); 71b9dea67fSPeter Grehan void _rtld_powerpc_pltresolve(void); 72b9dea67fSPeter Grehan void _rtld_powerpc_pltcall(void); 73b9dea67fSPeter Grehan 746c2a9753SSuleiman Souhlal /* 756c2a9753SSuleiman Souhlal * TLS 766c2a9753SSuleiman Souhlal */ 776c2a9753SSuleiman Souhlal 78fca32c74SDoug Rabson #define round(size, align) \ 79fca32c74SDoug Rabson (((size) + (align) - 1) & ~((align) - 1)) 80e5c3405cSKonstantin Belousov #define calculate_first_tls_offset(size, align, offset) \ 81953cba36SAndreas Tobler TLS_TCB_SIZE 82e5c3405cSKonstantin Belousov #define calculate_tls_offset(prev_offset, prev_size, size, align, offset) \ 83fca32c74SDoug Rabson round(prev_offset + prev_size, align) 8417fb2856SBrooks Davis #define calculate_tls_post_size(align) 0 85fca32c74SDoug Rabson 86fca32c74SDoug Rabson typedef struct { 87fca32c74SDoug Rabson unsigned long ti_module; 88fca32c74SDoug Rabson unsigned long ti_offset; 89fca32c74SDoug Rabson } tls_index; 90fca32c74SDoug Rabson 91fca32c74SDoug Rabson extern void *__tls_get_addr(tls_index* ti); 92fca32c74SDoug Rabson 9357462f8fSBrandon Bergren extern void powerpc_abi_variant_hook(Elf_Auxinfo **); 9457462f8fSBrandon Bergren #define md_abi_variant_hook(x) powerpc_abi_variant_hook(x) 958fd53f45SWarner Losh 96b9dea67fSPeter Grehan #endif 97