1 /* Machine-specific declarations for dynamic linker interface.  PowerPC version
2    Copyright (C) 2004-2021 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.  */
27 typedef 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.  */
37 typedef 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 
48 extern 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);
56 extern 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.  */
70 typedef 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.  */
82 typedef 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 
93 extern 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);
101 extern 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.  */
114 typedef 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.  */
126 typedef 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 
137 extern 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);
145 extern 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
157