|
|
1.1 root 1: # File to either setup register 2 to point to the GOT, or to adjust the
2: # pointers in the .got2 section to point to their new addresses.
3:
4: .file "eabi.asm"
5: .section ".text"
6: .globl __eabi
7:
8: .section ".got2","aw"
9: .LCTOC1 = . # +32768
10:
11: # Table of addresses
12: .Ltable = .-.LCTOC1
13: .long .LCTOC1 # address we are really at
14:
15: .Lgot = .-.LCTOC1
16: .long _GLOBAL_OFFSET_TABLE_ # normal GOT address
17:
18: .Lgots = .-.LCTOC1
19: .long _GOT_START_ # start of .got section
20:
21: .Lgote = .-.LCTOC1
22: .long _GOT_END_ # end of .got section
23:
24: .Lgot2s = .-.LCTOC1
25: .long _GOT2_START_ # -mrelocatable GOT pointers start
26:
27: .Lgot2e = .-.LCTOC1
28: .long _GOT2_END_ # -mrelocatable GOT pointers end
29:
30: .Lfixups = .-.LCTOC1
31: .long _FIXUP_START_ # start of .fixup section
32:
33: .Lfixupe = .-.LCTOC1
34: .long _FIXUP_END_ # end of .fixup section
35:
36: .text
37: .Lptr:
38: .long .LCTOC1-.Laddr # PC relative pointer to .got2
39: .long 0x4000 # traceback table
40:
41: __eabi: mflr 0
42: bl .Laddr # get current address
43: .Laddr:
44: mflr 12 # real address of .Laddr
45: lwz 11,(.Lptr-.Laddr)(12) # linker generated address of .LCTOC1
46: add 11,11,12 # correct to real pointer
47: lwz 12,.Ltable(11) # get linker's idea of where .Laddr is
48: subf. 12,12,11 # calculate difference
49: mtlr 0 # restore link register
50: bc 4,2,.Lreloc # skip if we need to relocate
51:
52: # Only load up register 2 if there is a .got section
53:
54: lwz 3,.Lgots(11) # start of .got section
55: lwz 4,.Lgote(11) # end of .got section
56: cmpw 1,3,4 # .got section non-empty?
57: bc 12,6,.Ldone
58:
59: # Normal program, load up register 2
60:
61: lwz 2,.Lgot(11) # normal GOT address (obsolete in register 2)
62: mr 13,2 # also same as _SDA_BASE_ (V.4 small data ptr)
63: b __do_global_ctors # do any C++ global constructors (which returns to caller)
64:
65: # We need to relocate the .got2 pointers. Don't load register 2
66:
67: .Lreloc:
68: lwz 3,.Lgot2s(11) # GOT pointers start
69: lwz 4,.Lgot2e(11) # GOT pointers end
70: add 3,12,3 # adjust pointers
71: add 4,12,4
72:
73: cmpw 1,3,4 # any pointers to adjust
74: bc 12,6,.Lfix
75:
76: .Lloop:
77: lwz 5,0(3) # next pointer
78: add 5,5,12 # adjust
79: stw 5,0(3)
80: addi 3,3,4 # bump to next word
81: cmpw 1,3,4 # more pointers to adjust?
82: bc 4,6,.Lloop
83:
84: # Fixup any user initialized pointers now (the compiler drops pointers to
85: # each of the relocs that it does in the .fixup section). Note, the pointers
86: # themselves have already been fixed up by the previous loop.
87:
88: .Lfix:
89: lwz 3,.Lfixups(11) # fixup pointers start
90: lwz 4,.Lfixupe(11) # fixup pointers end
91:
92: cmpw 1,3,4 # any user pointers to adjust
93: bc 12,6,.Ldone
94:
95: .Lfloop:
96: lwz 5,0(3) # next pointer
97: lwz 6,0(5) # get the pointer it points to
98: add 6,6,12 # adjust
99: stw 6,0(5)
100: addi 3,3,4 # bump to next word
101: cmpw 1,3,4 # more pointers to adjust?
102: bc 4,6,.Lfloop
103:
104: # Done adjusting pointers, return
105:
106: .Ldone:
107: b __do_global_ctors # do any C++ global constructors (which returns to caller)
108:
109: # Routines for saving floating point registers, called by the compiler.
110: # Called with r11 pointing to the stack header word of the caller of the
111: # function, just beyond the end of the floating point save area.
112:
113: .globl _savefpr_14
114: .globl _savefpr_15
115: .globl _savefpr_16
116: .globl _savefpr_17
117: .globl _savefpr_18
118: .globl _savefpr_19
119: .globl _savefpr_20
120: .globl _savefpr_21
121: .globl _savefpr_22
122: .globl _savefpr_23
123: .globl _savefpr_24
124: .globl _savefpr_25
125: .globl _savefpr_26
126: .globl _savefpr_27
127: .globl _savefpr_28
128: .globl _savefpr_29
129: .globl _savefpr_30
130: .globl _savefpr_31
131:
132: .long 0x00400000 # traceback tag
133: _savefpr_14: stfd 14,-144(11) # save fp registers
134: _savefpr_15: stfd 15,-136(11)
135: _savefpr_16: stfd 16,-128(11)
136: _savefpr_17: stfd 17,-120(11)
137: _savefpr_18: stfd 18,-112(11)
138: _savefpr_19: stfd 19,-104(11)
139: _savefpr_20: stfd 20,-96(11)
140: _savefpr_21: stfd 21,-88(11)
141: _savefpr_22: stfd 22,-80(11)
142: _savefpr_23: stfd 23,-72(11)
143: _savefpr_24: stfd 24,-64(11)
144: _savefpr_25: stfd 25,-56(11)
145: _savefpr_26: stfd 26,-48(11)
146: _savefpr_27: stfd 27,-40(11)
147: _savefpr_28: stfd 28,-32(11)
148: _savefpr_29: stfd 29,-24(11)
149: _savefpr_30: stfd 30,-16(11)
150: _savefpr_31: stfd 31,-8(11)
151: blr
152:
153: # Routines for saving integer registers, called by the compiler.
154: # Called with r11 pointing to the stack header word of the caller of the
155: # function, just beyond the end of the integer save area.
156:
157: .globl _savegpr_14
158: .globl _savegpr_15
159: .globl _savegpr_16
160: .globl _savegpr_17
161: .globl _savegpr_18
162: .globl _savegpr_19
163: .globl _savegpr_20
164: .globl _savegpr_21
165: .globl _savegpr_22
166: .globl _savegpr_23
167: .globl _savegpr_24
168: .globl _savegpr_25
169: .globl _savegpr_26
170: .globl _savegpr_27
171: .globl _savegpr_28
172: .globl _savegpr_29
173: .globl _savegpr_30
174: .globl _savegpr_31
175:
176: .long 0x00400000 # traceback tag
177: _savegpr_14: stw 14,-72(11) # save gp registers
178: _savegpr_15: stw 15,-68(11)
179: _savegpr_16: stw 16,-64(11)
180: _savegpr_17: stw 17,-60(11)
181: _savegpr_18: stw 18,-56(11)
182: _savegpr_19: stw 19,-52(11)
183: _savegpr_20: stw 20,-48(11)
184: _savegpr_21: stw 21,-44(11)
185: _savegpr_22: stw 22,-40(11)
186: _savegpr_23: stw 23,-36(11)
187: _savegpr_24: stw 24,-32(11)
188: _savegpr_25: stw 25,-28(11)
189: _savegpr_26: stw 26,-24(11)
190: _savegpr_27: stw 27,-20(11)
191: _savegpr_28: stw 28,-16(11)
192: _savegpr_29: stw 29,-12(11)
193: _savegpr_30: stw 30,-8(11)
194: _savegpr_31: stw 31,-4(11)
195: blr
196:
197: # Routines for restoring floating point registers, called by the compiler.
198: # Called with r11 pointing to the stack header word of the caller of the
199: # function, just beyond the end of the floating point save area.
200:
201: .globl _restfpr_14
202: .globl _restfpr_15
203: .globl _restfpr_16
204: .globl _restfpr_17
205: .globl _restfpr_18
206: .globl _restfpr_19
207: .globl _restfpr_20
208: .globl _restfpr_21
209: .globl _restfpr_22
210: .globl _restfpr_23
211: .globl _restfpr_24
212: .globl _restfpr_25
213: .globl _restfpr_26
214: .globl _restfpr_27
215: .globl _restfpr_28
216: .globl _restfpr_29
217: .globl _restfpr_30
218: .globl _restfpr_31
219:
220: .long 0x00600000 # traceback tag
221: _restfpr_14: lfd 14,-144(11) # restore fp registers
222: _restfpr_15: lfd 15,-136(11)
223: _restfpr_16: lfd 16,-128(11)
224: _restfpr_17: lfd 17,-120(11)
225: _restfpr_18: lfd 18,-112(11)
226: _restfpr_19: lfd 19,-104(11)
227: _restfpr_20: lfd 20,-96(11)
228: _restfpr_21: lfd 21,-88(11)
229: _restfpr_22: lfd 22,-80(11)
230: _restfpr_23: lfd 23,-72(11)
231: _restfpr_24: lfd 24,-64(11)
232: _restfpr_25: lfd 25,-56(11)
233: _restfpr_26: lfd 26,-48(11)
234: _restfpr_27: lfd 27,-40(11)
235: _restfpr_28: lfd 28,-32(11)
236: _restfpr_29: lfd 29,-24(11)
237: _restfpr_30: lfd 30,-16(11)
238: _restfpr_31: lfd 31,-8(11)
239: blr
240:
241: # Routines for restoring integer registers, called by the compiler.
242: # Called with r11 pointing to the stack header word of the caller of the
243: # function, just beyond the end of the integer restore area.
244:
245: .globl _restgpr_14
246: .globl _restgpr_15
247: .globl _restgpr_16
248: .globl _restgpr_17
249: .globl _restgpr_18
250: .globl _restgpr_19
251: .globl _restgpr_20
252: .globl _restgpr_21
253: .globl _restgpr_22
254: .globl _restgpr_23
255: .globl _restgpr_24
256: .globl _restgpr_25
257: .globl _restgpr_26
258: .globl _restgpr_27
259: .globl _restgpr_28
260: .globl _restgpr_29
261: .globl _restgpr_30
262: .globl _restgpr_31
263:
264: .long 0x00600000 # traceback tag
265: _restgpr_14: lwz 14,-72(11) # rest gp registers
266: _restgpr_15: lwz 15,-68(11)
267: _restgpr_16: lwz 16,-64(11)
268: _restgpr_17: lwz 17,-60(11)
269: _restgpr_18: lwz 18,-56(11)
270: _restgpr_19: lwz 19,-52(11)
271: _restgpr_20: lwz 20,-48(11)
272: _restgpr_21: lwz 21,-44(11)
273: _restgpr_22: lwz 22,-40(11)
274: _restgpr_23: lwz 23,-36(11)
275: _restgpr_24: lwz 24,-32(11)
276: _restgpr_25: lwz 25,-28(11)
277: _restgpr_26: lwz 26,-24(11)
278: _restgpr_27: lwz 27,-20(11)
279: _restgpr_28: lwz 28,-16(11)
280: _restgpr_29: lwz 29,-12(11)
281: _restgpr_30: lwz 30,-8(11)
282: _restgpr_31: lwz 31,-4(11)
283: blr
284:
285: # Routines for restoring floating point registers, called by the compiler.
286: # Called with r11 pointing to the stack header word of the caller of the
287: # function, just beyond the end of the floating point save area.
288: # In addition to restoring the fp registers, it will return to the caller's
289: # caller
290:
291: .globl _restfpr_14_x
292: .globl _restfpr_15_x
293: .globl _restfpr_16_x
294: .globl _restfpr_17_x
295: .globl _restfpr_18_x
296: .globl _restfpr_19_x
297: .globl _restfpr_20_x
298: .globl _restfpr_21_x
299: .globl _restfpr_22_x
300: .globl _restfpr_23_x
301: .globl _restfpr_24_x
302: .globl _restfpr_25_x
303: .globl _restfpr_26_x
304: .globl _restfpr_27_x
305: .globl _restfpr_28_x
306: .globl _restfpr_29_x
307: .globl _restfpr_30_x
308: .globl _restfpr_31_x
309:
310: .long 0x00600000 # traceback tag
311: _restfpr_14_x: lfd 14,-144(11) # restore fp registers
312: _restfpr_15_x: lfd 15,-136(11)
313: _restfpr_16_x: lfd 16,-128(11)
314: _restfpr_17_x: lfd 17,-120(11)
315: _restfpr_18_x: lfd 18,-112(11)
316: _restfpr_19_x: lfd 19,-104(11)
317: _restfpr_20_x: lfd 20,-96(11)
318: _restfpr_21_x: lfd 21,-88(11)
319: _restfpr_22_x: lfd 22,-80(11)
320: _restfpr_23_x: lfd 23,-72(11)
321: _restfpr_24_x: lfd 24,-64(11)
322: _restfpr_25_x: lfd 25,-56(11)
323: _restfpr_26_x: lfd 26,-48(11)
324: _restfpr_27_x: lfd 27,-40(11)
325: _restfpr_28_x: lfd 28,-32(11)
326: _restfpr_29_x: lfd 29,-24(11)
327: _restfpr_30_x: lfd 30,-16(11)
328: _restfpr_31_x: lwz 0,4(11)
329: lfd 31,-8(11)
330: mtlr 0
331: mr 1,11
332: blr
333:
334: # Routines for restoring integer registers, called by the compiler.
335: # Called with r11 pointing to the stack header word of the caller of the
336: # function, just beyond the end of the integer restore area.
337:
338: .globl _restgpr_14_x
339: .globl _restgpr_15_x
340: .globl _restgpr_16_x
341: .globl _restgpr_17_x
342: .globl _restgpr_18_x
343: .globl _restgpr_19_x
344: .globl _restgpr_20_x
345: .globl _restgpr_21_x
346: .globl _restgpr_22_x
347: .globl _restgpr_23_x
348: .globl _restgpr_24_x
349: .globl _restgpr_25_x
350: .globl _restgpr_26_x
351: .globl _restgpr_27_x
352: .globl _restgpr_28_x
353: .globl _restgpr_29_x
354: .globl _restgpr_30_x
355: .globl _restgpr_31_x
356:
357: .long 0x00600000 # traceback tag
358: _restgpr_14_x: lwz 14,-72(11) # rest gp registers
359: _restgpr_15_x: lwz 15,-68(11)
360: _restgpr_16_x: lwz 16,-64(11)
361: _restgpr_17_x: lwz 17,-60(11)
362: _restgpr_18_x: lwz 18,-56(11)
363: _restgpr_19_x: lwz 19,-52(11)
364: _restgpr_20_x: lwz 20,-48(11)
365: _restgpr_21_x: lwz 21,-44(11)
366: _restgpr_22_x: lwz 22,-40(11)
367: _restgpr_23_x: lwz 23,-36(11)
368: _restgpr_24_x: lwz 24,-32(11)
369: _restgpr_25_x: lwz 25,-28(11)
370: _restgpr_26_x: lwz 26,-24(11)
371: _restgpr_27_x: lwz 27,-20(11)
372: _restgpr_28_x: lwz 28,-16(11)
373: _restgpr_29_x: lwz 29,-12(11)
374: _restgpr_30_x: lwz 30,-8(11)
375: _restgpr_31_x: lwz 0,4(11)
376: lwz 31,-4(11)
377: mtlr 0
378: mr 1,11
379: blr
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.