|
|
1.1 root 1: /*
2: * Special support for eabi and SVR4
3: *
4: * Copyright (C) 1995, 1996, 1998, 2000, 2001 Free Software Foundation, Inc.
5: * Copyright 2008 Freescale Semiconductor, Inc.
6: * Written By Michael Meissner
7: *
8: * Based on gcc/config/rs6000/crtsavres.asm from gcc
9: * 64 bit additions from reading the PPC elf64abi document.
10: *
11: * This file is free software; you can redistribute it and/or modify it
12: * under the terms of the GNU General Public License as published by the
13: * Free Software Foundation; either version 2, or (at your option) any
14: * later version.
15: *
16: * In addition to the permissions in the GNU General Public License, the
17: * Free Software Foundation gives you unlimited permission to link the
18: * compiled version of this file with other programs, and to distribute
19: * those programs without any restriction coming from the use of this
20: * file. (The General Public License restrictions do apply in other
21: * respects; for example, they cover modification of the file, and
22: * distribution when not linked into another program.)
23: *
24: * This file is distributed in the hope that it will be useful, but
25: * WITHOUT ANY WARRANTY; without even the implied warranty of
26: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
27: * General Public License for more details.
28: *
29: * You should have received a copy of the GNU General Public License
30: * along with this program; see the file COPYING. If not, write to
31: * the Free Software Foundation, 51 Franklin Street, Fifth Floor,
32: * Boston, MA 02110-1301, USA.
33: *
34: * As a special exception, if you link this library with files
35: * compiled with GCC to produce an executable, this does not cause
36: * the resulting executable to be covered by the GNU General Public License.
37: * This exception does not however invalidate any other reasons why
38: * the executable file might be covered by the GNU General Public License.
39: */
40:
41: /* taken from Linux arch/powerpc/lib/crtsavres.S */
42:
43: /* arch/powerpc/include/asm/ppc_asm.h */
44: #ifdef CONFIG_PPC64
45:
46: #define XGLUE(a,b) a##b
47: #define GLUE(a,b) XGLUE(a,b)
48:
49: #define _GLOBAL(name) \
50: .section ".text"; \
51: .align 2 ; \
52: .globl name; \
53: .globl GLUE(.,name); \
54: .section ".opd","aw"; \
55: name: \
56: .quad GLUE(.,name); \
57: .quad .TOC.@tocbase; \
58: .quad 0; \
59: .previous; \
60: .type GLUE(.,name),@function; \
61: GLUE(.,name):
62:
63: #else /* 32-bit */
64:
65: /* include/linux/stringify.h */
66:
67: /* Indirect stringification. Doing two levels allows the parameter to be a
68: * macro itself. For example, compile with -DFOO=bar, __stringify(FOO)
69: * converts to "bar".
70: */
71:
72: #define __stringify_1(x...) #x
73: #define __stringify(x...) __stringify_1(x)
74:
75: /* arch/powerpc/include/asm/ppc_asm.h continues */
76:
77: #define _GLOBAL(n) \
78: .text; \
79: .stabs __stringify(n:F-1),N_FUN,0,0,n;\
80: .globl n; \
81: n:
82:
83: /* some stab codes */
84: #define N_FUN 36
85:
86: #endif
87:
88: /* arch/powerpc/lib/crtsavres.S continues */
89:
90: .file "crtsavres.S"
91: .section ".text"
92:
93: #ifndef CONFIG_PPC64
94:
95: /* Routines for saving integer registers, called by the compiler. */
96: /* Called with r11 pointing to the stack header word of the caller of the */
97: /* function, just beyond the end of the integer save area. */
98:
99: _GLOBAL(_savegpr_14)
100: _GLOBAL(_save32gpr_14)
101: stw 14,-72(11) /* save gp registers */
102: _GLOBAL(_savegpr_15)
103: _GLOBAL(_save32gpr_15)
104: stw 15,-68(11)
105: _GLOBAL(_savegpr_16)
106: _GLOBAL(_save32gpr_16)
107: stw 16,-64(11)
108: _GLOBAL(_savegpr_17)
109: _GLOBAL(_save32gpr_17)
110: stw 17,-60(11)
111: _GLOBAL(_savegpr_18)
112: _GLOBAL(_save32gpr_18)
113: stw 18,-56(11)
114: _GLOBAL(_savegpr_19)
115: _GLOBAL(_save32gpr_19)
116: stw 19,-52(11)
117: _GLOBAL(_savegpr_20)
118: _GLOBAL(_save32gpr_20)
119: stw 20,-48(11)
120: _GLOBAL(_savegpr_21)
121: _GLOBAL(_save32gpr_21)
122: stw 21,-44(11)
123: _GLOBAL(_savegpr_22)
124: _GLOBAL(_save32gpr_22)
125: stw 22,-40(11)
126: _GLOBAL(_savegpr_23)
127: _GLOBAL(_save32gpr_23)
128: stw 23,-36(11)
129: _GLOBAL(_savegpr_24)
130: _GLOBAL(_save32gpr_24)
131: stw 24,-32(11)
132: _GLOBAL(_savegpr_25)
133: _GLOBAL(_save32gpr_25)
134: stw 25,-28(11)
135: _GLOBAL(_savegpr_26)
136: _GLOBAL(_save32gpr_26)
137: stw 26,-24(11)
138: _GLOBAL(_savegpr_27)
139: _GLOBAL(_save32gpr_27)
140: stw 27,-20(11)
141: _GLOBAL(_savegpr_28)
142: _GLOBAL(_save32gpr_28)
143: stw 28,-16(11)
144: _GLOBAL(_savegpr_29)
145: _GLOBAL(_save32gpr_29)
146: stw 29,-12(11)
147: _GLOBAL(_savegpr_30)
148: _GLOBAL(_save32gpr_30)
149: stw 30,-8(11)
150: _GLOBAL(_savegpr_31)
151: _GLOBAL(_save32gpr_31)
152: stw 31,-4(11)
153: blr
154:
155: /* Routines for restoring integer registers, called by the compiler. */
156: /* Called with r11 pointing to the stack header word of the caller of the */
157: /* function, just beyond the end of the integer restore area. */
158:
159: _GLOBAL(_restgpr_14)
160: _GLOBAL(_rest32gpr_14)
161: lwz 14,-72(11) /* restore gp registers */
162: _GLOBAL(_restgpr_15)
163: _GLOBAL(_rest32gpr_15)
164: lwz 15,-68(11)
165: _GLOBAL(_restgpr_16)
166: _GLOBAL(_rest32gpr_16)
167: lwz 16,-64(11)
168: _GLOBAL(_restgpr_17)
169: _GLOBAL(_rest32gpr_17)
170: lwz 17,-60(11)
171: _GLOBAL(_restgpr_18)
172: _GLOBAL(_rest32gpr_18)
173: lwz 18,-56(11)
174: _GLOBAL(_restgpr_19)
175: _GLOBAL(_rest32gpr_19)
176: lwz 19,-52(11)
177: _GLOBAL(_restgpr_20)
178: _GLOBAL(_rest32gpr_20)
179: lwz 20,-48(11)
180: _GLOBAL(_restgpr_21)
181: _GLOBAL(_rest32gpr_21)
182: lwz 21,-44(11)
183: _GLOBAL(_restgpr_22)
184: _GLOBAL(_rest32gpr_22)
185: lwz 22,-40(11)
186: _GLOBAL(_restgpr_23)
187: _GLOBAL(_rest32gpr_23)
188: lwz 23,-36(11)
189: _GLOBAL(_restgpr_24)
190: _GLOBAL(_rest32gpr_24)
191: lwz 24,-32(11)
192: _GLOBAL(_restgpr_25)
193: _GLOBAL(_rest32gpr_25)
194: lwz 25,-28(11)
195: _GLOBAL(_restgpr_26)
196: _GLOBAL(_rest32gpr_26)
197: lwz 26,-24(11)
198: _GLOBAL(_restgpr_27)
199: _GLOBAL(_rest32gpr_27)
200: lwz 27,-20(11)
201: _GLOBAL(_restgpr_28)
202: _GLOBAL(_rest32gpr_28)
203: lwz 28,-16(11)
204: _GLOBAL(_restgpr_29)
205: _GLOBAL(_rest32gpr_29)
206: lwz 29,-12(11)
207: _GLOBAL(_restgpr_30)
208: _GLOBAL(_rest32gpr_30)
209: lwz 30,-8(11)
210: _GLOBAL(_restgpr_31)
211: _GLOBAL(_rest32gpr_31)
212: lwz 31,-4(11)
213: blr
214:
215: /* Routines for restoring integer registers, called by the compiler. */
216: /* Called with r11 pointing to the stack header word of the caller of the */
217: /* function, just beyond the end of the integer restore area. */
218:
219: _GLOBAL(_restgpr_14_x)
220: _GLOBAL(_rest32gpr_14_x)
221: lwz 14,-72(11) /* restore gp registers */
222: _GLOBAL(_restgpr_15_x)
223: _GLOBAL(_rest32gpr_15_x)
224: lwz 15,-68(11)
225: _GLOBAL(_restgpr_16_x)
226: _GLOBAL(_rest32gpr_16_x)
227: lwz 16,-64(11)
228: _GLOBAL(_restgpr_17_x)
229: _GLOBAL(_rest32gpr_17_x)
230: lwz 17,-60(11)
231: _GLOBAL(_restgpr_18_x)
232: _GLOBAL(_rest32gpr_18_x)
233: lwz 18,-56(11)
234: _GLOBAL(_restgpr_19_x)
235: _GLOBAL(_rest32gpr_19_x)
236: lwz 19,-52(11)
237: _GLOBAL(_restgpr_20_x)
238: _GLOBAL(_rest32gpr_20_x)
239: lwz 20,-48(11)
240: _GLOBAL(_restgpr_21_x)
241: _GLOBAL(_rest32gpr_21_x)
242: lwz 21,-44(11)
243: _GLOBAL(_restgpr_22_x)
244: _GLOBAL(_rest32gpr_22_x)
245: lwz 22,-40(11)
246: _GLOBAL(_restgpr_23_x)
247: _GLOBAL(_rest32gpr_23_x)
248: lwz 23,-36(11)
249: _GLOBAL(_restgpr_24_x)
250: _GLOBAL(_rest32gpr_24_x)
251: lwz 24,-32(11)
252: _GLOBAL(_restgpr_25_x)
253: _GLOBAL(_rest32gpr_25_x)
254: lwz 25,-28(11)
255: _GLOBAL(_restgpr_26_x)
256: _GLOBAL(_rest32gpr_26_x)
257: lwz 26,-24(11)
258: _GLOBAL(_restgpr_27_x)
259: _GLOBAL(_rest32gpr_27_x)
260: lwz 27,-20(11)
261: _GLOBAL(_restgpr_28_x)
262: _GLOBAL(_rest32gpr_28_x)
263: lwz 28,-16(11)
264: _GLOBAL(_restgpr_29_x)
265: _GLOBAL(_rest32gpr_29_x)
266: lwz 29,-12(11)
267: _GLOBAL(_restgpr_30_x)
268: _GLOBAL(_rest32gpr_30_x)
269: lwz 30,-8(11)
270: _GLOBAL(_restgpr_31_x)
271: _GLOBAL(_rest32gpr_31_x)
272: lwz 0,4(11)
273: lwz 31,-4(11)
274: mtlr 0
275: mr 1,11
276: blr
277:
278: #else /* CONFIG_PPC64 */
279:
280: .globl _savegpr0_14
281: _savegpr0_14:
282: std r14,-144(r1)
283: .globl _savegpr0_15
284: _savegpr0_15:
285: std r15,-136(r1)
286: .globl _savegpr0_16
287: _savegpr0_16:
288: std r16,-128(r1)
289: .globl _savegpr0_17
290: _savegpr0_17:
291: std r17,-120(r1)
292: .globl _savegpr0_18
293: _savegpr0_18:
294: std r18,-112(r1)
295: .globl _savegpr0_19
296: _savegpr0_19:
297: std r19,-104(r1)
298: .globl _savegpr0_20
299: _savegpr0_20:
300: std r20,-96(r1)
301: .globl _savegpr0_21
302: _savegpr0_21:
303: std r21,-88(r1)
304: .globl _savegpr0_22
305: _savegpr0_22:
306: std r22,-80(r1)
307: .globl _savegpr0_23
308: _savegpr0_23:
309: std r23,-72(r1)
310: .globl _savegpr0_24
311: _savegpr0_24:
312: std r24,-64(r1)
313: .globl _savegpr0_25
314: _savegpr0_25:
315: std r25,-56(r1)
316: .globl _savegpr0_26
317: _savegpr0_26:
318: std r26,-48(r1)
319: .globl _savegpr0_27
320: _savegpr0_27:
321: std r27,-40(r1)
322: .globl _savegpr0_28
323: _savegpr0_28:
324: std r28,-32(r1)
325: .globl _savegpr0_29
326: _savegpr0_29:
327: std r29,-24(r1)
328: .globl _savegpr0_30
329: _savegpr0_30:
330: std r30,-16(r1)
331: .globl _savegpr0_31
332: _savegpr0_31:
333: std r31,-8(r1)
334: std r0,16(r1)
335: blr
336:
337: .globl _restgpr0_14
338: _restgpr0_14:
339: ld r14,-144(r1)
340: .globl _restgpr0_15
341: _restgpr0_15:
342: ld r15,-136(r1)
343: .globl _restgpr0_16
344: _restgpr0_16:
345: ld r16,-128(r1)
346: .globl _restgpr0_17
347: _restgpr0_17:
348: ld r17,-120(r1)
349: .globl _restgpr0_18
350: _restgpr0_18:
351: ld r18,-112(r1)
352: .globl _restgpr0_19
353: _restgpr0_19:
354: ld r19,-104(r1)
355: .globl _restgpr0_20
356: _restgpr0_20:
357: ld r20,-96(r1)
358: .globl _restgpr0_21
359: _restgpr0_21:
360: ld r21,-88(r1)
361: .globl _restgpr0_22
362: _restgpr0_22:
363: ld r22,-80(r1)
364: .globl _restgpr0_23
365: _restgpr0_23:
366: ld r23,-72(r1)
367: .globl _restgpr0_24
368: _restgpr0_24:
369: ld r24,-64(r1)
370: .globl _restgpr0_25
371: _restgpr0_25:
372: ld r25,-56(r1)
373: .globl _restgpr0_26
374: _restgpr0_26:
375: ld r26,-48(r1)
376: .globl _restgpr0_27
377: _restgpr0_27:
378: ld r27,-40(r1)
379: .globl _restgpr0_28
380: _restgpr0_28:
381: ld r28,-32(r1)
382: .globl _restgpr0_29
383: _restgpr0_29:
384: ld r0,16(r1)
385: ld r29,-24(r1)
386: mtlr r0
387: ld r30,-16(r1)
388: ld r31,-8(r1)
389: blr
390:
391: .globl _restgpr0_30
392: _restgpr0_30:
393: ld r30,-16(r1)
394: .globl _restgpr0_31
395: _restgpr0_31:
396: ld r0,16(r1)
397: ld r31,-8(r1)
398: mtlr r0
399: blr
400:
401: #endif /* CONFIG_PPC64 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.