home *** CD-ROM | disk | FTP | other *** search
- # File to either setup register 2 to point to the GOT, or to adjust the
- # pointers in the .got2 section to point to their new addresses.
-
- .file "eabi.asm"
- .section ".text"
- .globl __eabi
-
- .section ".got2","aw"
- .LCTOC1 = . # +32768
-
- # Table of addresses
- .Ltable = .-.LCTOC1
- .long .LCTOC1 # address we are really at
-
- .Lgot = .-.LCTOC1
- .long _GLOBAL_OFFSET_TABLE_ # normal GOT address
-
- .Lgots = .-.LCTOC1
- .long _GOT_START_ # start of .got section
-
- .Lgote = .-.LCTOC1
- .long _GOT_END_ # end of .got section
-
- .Lgot2s = .-.LCTOC1
- .long _GOT2_START_ # -mrelocatable GOT pointers start
-
- .Lgot2e = .-.LCTOC1
- .long _GOT2_END_ # -mrelocatable GOT pointers end
-
- .Lfixups = .-.LCTOC1
- .long _FIXUP_START_ # start of .fixup section
-
- .Lfixupe = .-.LCTOC1
- .long _FIXUP_END_ # end of .fixup section
-
- .text
- .Lptr:
- .long .LCTOC1-.Laddr # PC relative pointer to .got2
- .long 0x4000 # traceback table
-
- __eabi: mflr 0
- bl .Laddr # get current address
- .Laddr:
- mflr 12 # real address of .Laddr
- lwz 11,(.Lptr-.Laddr)(12) # linker generated address of .LCTOC1
- add 11,11,12 # correct to real pointer
- lwz 12,.Ltable(11) # get linker's idea of where .Laddr is
- subf. 12,12,11 # calculate difference
- mtlr 0 # restore link register
- bc 4,2,.Lreloc # skip if we need to relocate
-
- # Only load up register 2 if there is a .got section
-
- lwz 3,.Lgots(11) # start of .got section
- lwz 4,.Lgote(11) # end of .got section
- cmpw 1,3,4 # .got section non-empty?
- bc 12,6,.Ldone
-
- # Normal program, load up register 2
-
- lwz 2,.Lgot(11) # normal GOT address (obsolete in register 2)
- mr 13,2 # also same as _SDA_BASE_ (V.4 small data ptr)
- b __do_global_ctors # do any C++ global constructors (which returns to caller)
-
- # We need to relocate the .got2 pointers. Don't load register 2
-
- .Lreloc:
- lwz 3,.Lgot2s(11) # GOT pointers start
- lwz 4,.Lgot2e(11) # GOT pointers end
- add 3,12,3 # adjust pointers
- add 4,12,4
-
- cmpw 1,3,4 # any pointers to adjust
- bc 12,6,.Lfix
-
- .Lloop:
- lwz 5,0(3) # next pointer
- add 5,5,12 # adjust
- stw 5,0(3)
- addi 3,3,4 # bump to next word
- cmpw 1,3,4 # more pointers to adjust?
- bc 4,6,.Lloop
-
- # Fixup any user initialized pointers now (the compiler drops pointers to
- # each of the relocs that it does in the .fixup section). Note, the pointers
- # themselves have already been fixed up by the previous loop.
-
- .Lfix:
- lwz 3,.Lfixups(11) # fixup pointers start
- lwz 4,.Lfixupe(11) # fixup pointers end
-
- cmpw 1,3,4 # any user pointers to adjust
- bc 12,6,.Ldone
-
- .Lfloop:
- lwz 5,0(3) # next pointer
- lwz 6,0(5) # get the pointer it points to
- add 6,6,12 # adjust
- stw 6,0(5)
- addi 3,3,4 # bump to next word
- cmpw 1,3,4 # more pointers to adjust?
- bc 4,6,.Lfloop
-
- # Done adjusting pointers, return
-
- .Ldone:
- b __do_global_ctors # do any C++ global constructors (which returns to caller)
-
- # Routines for saving floating point registers, called by the compiler.
- # Called with r11 pointing to the stack header word of the caller of the
- # function, just beyond the end of the floating point save area.
-
- .globl _savefpr_14
- .globl _savefpr_15
- .globl _savefpr_16
- .globl _savefpr_17
- .globl _savefpr_18
- .globl _savefpr_19
- .globl _savefpr_20
- .globl _savefpr_21
- .globl _savefpr_22
- .globl _savefpr_23
- .globl _savefpr_24
- .globl _savefpr_25
- .globl _savefpr_26
- .globl _savefpr_27
- .globl _savefpr_28
- .globl _savefpr_29
- .globl _savefpr_30
- .globl _savefpr_31
-
- .long 0x00400000 # traceback tag
- _savefpr_14: stfd 14,-144(11) # save fp registers
- _savefpr_15: stfd 15,-136(11)
- _savefpr_16: stfd 16,-128(11)
- _savefpr_17: stfd 17,-120(11)
- _savefpr_18: stfd 18,-112(11)
- _savefpr_19: stfd 19,-104(11)
- _savefpr_20: stfd 20,-96(11)
- _savefpr_21: stfd 21,-88(11)
- _savefpr_22: stfd 22,-80(11)
- _savefpr_23: stfd 23,-72(11)
- _savefpr_24: stfd 24,-64(11)
- _savefpr_25: stfd 25,-56(11)
- _savefpr_26: stfd 26,-48(11)
- _savefpr_27: stfd 27,-40(11)
- _savefpr_28: stfd 28,-32(11)
- _savefpr_29: stfd 29,-24(11)
- _savefpr_30: stfd 30,-16(11)
- _savefpr_31: stfd 31,-8(11)
- blr
-
- # Routines for saving integer registers, called by the compiler.
- # Called with r11 pointing to the stack header word of the caller of the
- # function, just beyond the end of the integer save area.
-
- .globl _savegpr_14
- .globl _savegpr_15
- .globl _savegpr_16
- .globl _savegpr_17
- .globl _savegpr_18
- .globl _savegpr_19
- .globl _savegpr_20
- .globl _savegpr_21
- .globl _savegpr_22
- .globl _savegpr_23
- .globl _savegpr_24
- .globl _savegpr_25
- .globl _savegpr_26
- .globl _savegpr_27
- .globl _savegpr_28
- .globl _savegpr_29
- .globl _savegpr_30
- .globl _savegpr_31
-
- .long 0x00400000 # traceback tag
- _savegpr_14: stw 14,-72(11) # save gp registers
- _savegpr_15: stw 15,-68(11)
- _savegpr_16: stw 16,-64(11)
- _savegpr_17: stw 17,-60(11)
- _savegpr_18: stw 18,-56(11)
- _savegpr_19: stw 19,-52(11)
- _savegpr_20: stw 20,-48(11)
- _savegpr_21: stw 21,-44(11)
- _savegpr_22: stw 22,-40(11)
- _savegpr_23: stw 23,-36(11)
- _savegpr_24: stw 24,-32(11)
- _savegpr_25: stw 25,-28(11)
- _savegpr_26: stw 26,-24(11)
- _savegpr_27: stw 27,-20(11)
- _savegpr_28: stw 28,-16(11)
- _savegpr_29: stw 29,-12(11)
- _savegpr_30: stw 30,-8(11)
- _savegpr_31: stw 31,-4(11)
- blr
-
- # Routines for restoring floating point registers, called by the compiler.
- # Called with r11 pointing to the stack header word of the caller of the
- # function, just beyond the end of the floating point save area.
-
- .globl _restfpr_14
- .globl _restfpr_15
- .globl _restfpr_16
- .globl _restfpr_17
- .globl _restfpr_18
- .globl _restfpr_19
- .globl _restfpr_20
- .globl _restfpr_21
- .globl _restfpr_22
- .globl _restfpr_23
- .globl _restfpr_24
- .globl _restfpr_25
- .globl _restfpr_26
- .globl _restfpr_27
- .globl _restfpr_28
- .globl _restfpr_29
- .globl _restfpr_30
- .globl _restfpr_31
-
- .long 0x00600000 # traceback tag
- _restfpr_14: lfd 14,-144(11) # restore fp registers
- _restfpr_15: lfd 15,-136(11)
- _restfpr_16: lfd 16,-128(11)
- _restfpr_17: lfd 17,-120(11)
- _restfpr_18: lfd 18,-112(11)
- _restfpr_19: lfd 19,-104(11)
- _restfpr_20: lfd 20,-96(11)
- _restfpr_21: lfd 21,-88(11)
- _restfpr_22: lfd 22,-80(11)
- _restfpr_23: lfd 23,-72(11)
- _restfpr_24: lfd 24,-64(11)
- _restfpr_25: lfd 25,-56(11)
- _restfpr_26: lfd 26,-48(11)
- _restfpr_27: lfd 27,-40(11)
- _restfpr_28: lfd 28,-32(11)
- _restfpr_29: lfd 29,-24(11)
- _restfpr_30: lfd 30,-16(11)
- _restfpr_31: lfd 31,-8(11)
- blr
-
- # Routines for restoring integer registers, called by the compiler.
- # Called with r11 pointing to the stack header word of the caller of the
- # function, just beyond the end of the integer restore area.
-
- .globl _restgpr_14
- .globl _restgpr_15
- .globl _restgpr_16
- .globl _restgpr_17
- .globl _restgpr_18
- .globl _restgpr_19
- .globl _restgpr_20
- .globl _restgpr_21
- .globl _restgpr_22
- .globl _restgpr_23
- .globl _restgpr_24
- .globl _restgpr_25
- .globl _restgpr_26
- .globl _restgpr_27
- .globl _restgpr_28
- .globl _restgpr_29
- .globl _restgpr_30
- .globl _restgpr_31
-
- .long 0x00600000 # traceback tag
- _restgpr_14: lwz 14,-72(11) # rest gp registers
- _restgpr_15: lwz 15,-68(11)
- _restgpr_16: lwz 16,-64(11)
- _restgpr_17: lwz 17,-60(11)
- _restgpr_18: lwz 18,-56(11)
- _restgpr_19: lwz 19,-52(11)
- _restgpr_20: lwz 20,-48(11)
- _restgpr_21: lwz 21,-44(11)
- _restgpr_22: lwz 22,-40(11)
- _restgpr_23: lwz 23,-36(11)
- _restgpr_24: lwz 24,-32(11)
- _restgpr_25: lwz 25,-28(11)
- _restgpr_26: lwz 26,-24(11)
- _restgpr_27: lwz 27,-20(11)
- _restgpr_28: lwz 28,-16(11)
- _restgpr_29: lwz 29,-12(11)
- _restgpr_30: lwz 30,-8(11)
- _restgpr_31: lwz 31,-4(11)
- blr
-
- # Routines for restoring floating point registers, called by the compiler.
- # Called with r11 pointing to the stack header word of the caller of the
- # function, just beyond the end of the floating point save area.
- # In addition to restoring the fp registers, it will return to the caller's
- # caller
-
- .globl _restfpr_14_x
- .globl _restfpr_15_x
- .globl _restfpr_16_x
- .globl _restfpr_17_x
- .globl _restfpr_18_x
- .globl _restfpr_19_x
- .globl _restfpr_20_x
- .globl _restfpr_21_x
- .globl _restfpr_22_x
- .globl _restfpr_23_x
- .globl _restfpr_24_x
- .globl _restfpr_25_x
- .globl _restfpr_26_x
- .globl _restfpr_27_x
- .globl _restfpr_28_x
- .globl _restfpr_29_x
- .globl _restfpr_30_x
- .globl _restfpr_31_x
-
- .long 0x00600000 # traceback tag
- _restfpr_14_x: lfd 14,-144(11) # restore fp registers
- _restfpr_15_x: lfd 15,-136(11)
- _restfpr_16_x: lfd 16,-128(11)
- _restfpr_17_x: lfd 17,-120(11)
- _restfpr_18_x: lfd 18,-112(11)
- _restfpr_19_x: lfd 19,-104(11)
- _restfpr_20_x: lfd 20,-96(11)
- _restfpr_21_x: lfd 21,-88(11)
- _restfpr_22_x: lfd 22,-80(11)
- _restfpr_23_x: lfd 23,-72(11)
- _restfpr_24_x: lfd 24,-64(11)
- _restfpr_25_x: lfd 25,-56(11)
- _restfpr_26_x: lfd 26,-48(11)
- _restfpr_27_x: lfd 27,-40(11)
- _restfpr_28_x: lfd 28,-32(11)
- _restfpr_29_x: lfd 29,-24(11)
- _restfpr_30_x: lfd 30,-16(11)
- _restfpr_31_x: lwz 0,4(11)
- lfd 31,-8(11)
- mtlr 0
- mr 1,11
- blr
-
- # Routines for restoring integer registers, called by the compiler.
- # Called with r11 pointing to the stack header word of the caller of the
- # function, just beyond the end of the integer restore area.
-
- .globl _restgpr_14_x
- .globl _restgpr_15_x
- .globl _restgpr_16_x
- .globl _restgpr_17_x
- .globl _restgpr_18_x
- .globl _restgpr_19_x
- .globl _restgpr_20_x
- .globl _restgpr_21_x
- .globl _restgpr_22_x
- .globl _restgpr_23_x
- .globl _restgpr_24_x
- .globl _restgpr_25_x
- .globl _restgpr_26_x
- .globl _restgpr_27_x
- .globl _restgpr_28_x
- .globl _restgpr_29_x
- .globl _restgpr_30_x
- .globl _restgpr_31_x
-
- .long 0x00600000 # traceback tag
- _restgpr_14_x: lwz 14,-72(11) # rest gp registers
- _restgpr_15_x: lwz 15,-68(11)
- _restgpr_16_x: lwz 16,-64(11)
- _restgpr_17_x: lwz 17,-60(11)
- _restgpr_18_x: lwz 18,-56(11)
- _restgpr_19_x: lwz 19,-52(11)
- _restgpr_20_x: lwz 20,-48(11)
- _restgpr_21_x: lwz 21,-44(11)
- _restgpr_22_x: lwz 22,-40(11)
- _restgpr_23_x: lwz 23,-36(11)
- _restgpr_24_x: lwz 24,-32(11)
- _restgpr_25_x: lwz 25,-28(11)
- _restgpr_26_x: lwz 26,-24(11)
- _restgpr_27_x: lwz 27,-20(11)
- _restgpr_28_x: lwz 28,-16(11)
- _restgpr_29_x: lwz 29,-12(11)
- _restgpr_30_x: lwz 30,-8(11)
- _restgpr_31_x: lwz 0,4(11)
- lwz 31,-4(11)
- mtlr 0
- mr 1,11
- blr
-