1/* Machine-specific declarations for dynamic linker interface.  PowerPC version
  2   Copyright (C) 2004-2025 Free Software Foundation, Inc.
  3   This file is part of the GNU C Library.
  4
  5   The GNU C Library is free software; you can redistribute it and/or
  6   modify it under the terms of the GNU Lesser General Public
  7   License as published by the Free Software Foundation; either
  8   version 2.1 of the License, or (at your option) any later version.
  9
 10   The GNU C Library is distributed in the hope that it will be useful,
 11   but WITHOUT ANY WARRANTY; without even the implied warranty of
 12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 13   Lesser General Public License for more details.
 14
 15   You should have received a copy of the GNU Lesser General Public
 16   License along with the GNU C Library; if not, see
 17   <https://www.gnu.org/licenses/>.  */
 18
 19#ifndef	_LINK_H
 20# error "Never include <bits/link.h> directly; use <link.h> instead."
 21#endif
 22
 23
 24#if __ELF_NATIVE_CLASS == 32
 25
 26/* Registers for entry into PLT on PPC32.  */
 27typedef struct La_ppc32_regs
 28{
 29  uint32_t lr_reg[8];
 30  double lr_fp[8];
 31  uint32_t lr_vreg[12][4];
 32  uint32_t lr_r1;
 33  uint32_t lr_lr;
 34} La_ppc32_regs;
 35
 36/* Return values for calls from PLT on PPC32.  */
 37typedef struct La_ppc32_retval
 38{
 39  uint32_t lrv_r3;
 40  uint32_t lrv_r4;
 41  double lrv_fp[8];
 42  uint32_t lrv_v2[4];
 43} La_ppc32_retval;
 44
 45
 46__BEGIN_DECLS
 47
 48extern Elf32_Addr la_ppc32_gnu_pltenter (Elf32_Sym *__sym,
 49					 unsigned int __ndx,
 50					 uintptr_t *__refcook,
 51					 uintptr_t *__defcook,
 52					 La_ppc32_regs *__regs,
 53					 unsigned int *__flags,
 54					 const char *__symname,
 55					 long int *__framesizep);
 56extern unsigned int la_ppc32_gnu_pltexit (Elf32_Sym *__sym,
 57					  unsigned int __ndx,
 58					  uintptr_t *__refcook,
 59					  uintptr_t *__defcook,
 60					  const La_ppc32_regs *__inregs,
 61					  La_ppc32_retval *__outregs,
 62					  const char *__symname);
 63
 64__END_DECLS
 65
 66#elif __ELF_NATIVE_CLASS == 64
 67# if _CALL_ELF != 2
 68
 69/* Registers for entry into PLT on PPC64.  */
 70typedef struct La_ppc64_regs
 71{
 72  uint64_t lr_reg[8];
 73  double lr_fp[13];
 74  uint32_t __padding;
 75  uint32_t lr_vrsave;
 76  uint32_t lr_vreg[12][4];
 77  uint64_t lr_r1;
 78  uint64_t lr_lr;
 79} La_ppc64_regs;
 80
 81/* Return values for calls from PLT on PPC64.  */
 82typedef struct La_ppc64_retval
 83{
 84  uint64_t lrv_r3;
 85  uint64_t lrv_r4;
 86  double lrv_fp[4];	/* f1-f4, float - complex long double.  */
 87  uint32_t lrv_v2[4];	/* v2.  */
 88} La_ppc64_retval;
 89
 90
 91__BEGIN_DECLS
 92
 93extern Elf64_Addr la_ppc64_gnu_pltenter (Elf64_Sym *__sym,
 94					 unsigned int __ndx,
 95					 uintptr_t *__refcook,
 96					 uintptr_t *__defcook,
 97					 La_ppc64_regs *__regs,
 98					 unsigned int *__flags,
 99					 const char *__symname,
100					 long int *__framesizep);
101extern unsigned int la_ppc64_gnu_pltexit (Elf64_Sym *__sym,
102					  unsigned int __ndx,
103					  uintptr_t *__refcook,
104					  uintptr_t *__defcook,
105					  const La_ppc64_regs *__inregs,
106					  La_ppc64_retval *__outregs,
107					  const char *__symname);
108
109__END_DECLS
110
111# else
112
113/* Registers for entry into PLT on PPC64 in the ELFv2 ABI.  */
114typedef struct La_ppc64v2_regs
115{
116  uint64_t lr_reg[8];
117  double lr_fp[13];
118  uint32_t __padding;
119  uint32_t lr_vrsave;
120  uint32_t lr_vreg[12][4] __attribute__ ((aligned (16)));
121  uint64_t lr_r1;
122  uint64_t lr_lr;
123} La_ppc64v2_regs;
124
125/* Return values for calls from PLT on PPC64 in the ELFv2 ABI.  */
126typedef struct La_ppc64v2_retval
127{
128  uint64_t lrv_r3;
129  uint64_t lrv_r4;
130  double lrv_fp[10];
131  uint32_t lrv_vreg[8][4] __attribute__ ((aligned (16)));
132} La_ppc64v2_retval;
133
134
135__BEGIN_DECLS
136
137extern Elf64_Addr la_ppc64v2_gnu_pltenter (Elf64_Sym *__sym,
138					   unsigned int __ndx,
139					   uintptr_t *__refcook,
140					   uintptr_t *__defcook,
141					   La_ppc64v2_regs *__regs,
142					   unsigned int *__flags,
143					   const char *__symname,
144					   long int *__framesizep);
145extern unsigned int la_ppc64v2_gnu_pltexit (Elf64_Sym *__sym,
146					    unsigned int __ndx,
147					    uintptr_t *__refcook,
148					    uintptr_t *__defcook,
149					    const La_ppc64v2_regs *__inregs,
150					    La_ppc64v2_retval *__outregs,
151					    const char *__symname);
152
153__END_DECLS
154
155# endif
156#endif