| /* PLT trampolines. m68k version. |
| Copyright (C) 2005-2014 Free Software Foundation, Inc. |
| This file is part of the GNU C Library. |
| |
| The GNU C Library is free software; you can redistribute it and/or |
| modify it under the terms of the GNU Lesser General Public |
| License as published by the Free Software Foundation; either |
| version 2.1 of the License, or (at your option) any later version. |
| |
| The GNU C Library is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| Lesser General Public License for more details. |
| |
| You should have received a copy of the GNU Lesser General Public |
| License along with the GNU C Library. If not, see |
| <http://www.gnu.org/licenses/>. */ |
| |
| #include <sysdep.h> |
| |
| #if !defined (__mcoldfire__) |
| # define FMOVE fmove.x |
| # define FPSPACE 12 |
| #elif defined (__mcffpu__) |
| # define FMOVE fmove.d |
| # define FPSPACE 8 |
| #else |
| # define FPSPACE 0 |
| #endif |
| |
| .text |
| .globl _dl_runtime_resolve |
| .type _dl_runtime_resolve, @function |
| _dl_runtime_resolve: |
| cfi_startproc |
| cfi_adjust_cfa_offset (8) |
| | Save %a0 (struct return address) and %a1. |
| move.l %a0, -(%sp) |
| cfi_adjust_cfa_offset (4) |
| move.l %a1, -(%sp) |
| cfi_adjust_cfa_offset (4) |
| | Call the real address resolver. |
| jbsr _dl_fixup |
| | Restore register %a0 and %a1. |
| move.l (%sp)+, %a1 |
| cfi_adjust_cfa_offset (-4) |
| move.l (%sp)+, %a0 |
| cfi_adjust_cfa_offset (-4) |
| | Pop parameters |
| addq.l #8, %sp |
| cfi_adjust_cfa_offset (-8) |
| | Call real function. |
| #ifdef __mcoldfire__ |
| move.l %d0,-(%sp) |
| cfi_adjust_cfa_offset (4) |
| rts |
| #else |
| jmp (%d0) |
| #endif |
| cfi_endproc |
| .size _dl_runtime_resolve, . - _dl_runtime_resolve |
| |
| .text |
| .globl _dl_runtime_profile |
| .type _dl_runtime_profile, @function |
| _dl_runtime_profile: |
| cfi_startproc |
| cfi_adjust_cfa_offset (8) |
| pea 8(%sp) |
| cfi_adjust_cfa_offset (4) |
| move.l %a1, -(%sp) |
| cfi_adjust_cfa_offset (4) |
| move.l %a0, -(%sp) |
| cfi_adjust_cfa_offset (4) |
| pea -1.w |
| cfi_adjust_cfa_offset (4) |
| | Push parameters for _dl_profile_fixup |
| pea (%sp) |
| cfi_adjust_cfa_offset (4) |
| pea 8(%sp) |
| cfi_adjust_cfa_offset (4) |
| move.l 32(%sp), -(%sp) |
| cfi_adjust_cfa_offset (4) |
| move.l 32(%sp), -(%sp) |
| cfi_adjust_cfa_offset (4) |
| move.l 32(%sp), -(%sp) |
| cfi_adjust_cfa_offset (4) |
| subq.l #8, %sp |
| cfi_adjust_cfa_offset (8) |
| | Call the real address resolver. |
| jbsr _dl_profile_fixup |
| | Pop parameters |
| lea 28(%sp), %sp |
| cfi_adjust_cfa_offset (-28) |
| move.l (%sp), %d1 |
| jpl 1f |
| addq.l #4, %sp |
| cfi_adjust_cfa_offset (-4) |
| | Restore register %a0 and %a1. |
| move.l (%sp)+, %a0 |
| cfi_adjust_cfa_offset (-4) |
| move.l (%sp)+, %a1 |
| cfi_adjust_cfa_offset (-4) |
| lea 12(%sp), %sp |
| cfi_adjust_cfa_offset (-12) |
| | Call real function. |
| #ifdef __mcoldfire__ |
| move.l %d0,-(%sp) |
| cfi_adjust_cfa_offset (4) |
| rts |
| #else |
| jmp (%d0) |
| #endif |
| |
| /* |
| +24 return address |
| +20 PLT1 |
| +16 PLT2 |
| +12 %sp |
| +8 %a1 |
| +4 %a0 |
| %sp free |
| */ |
| #ifdef __mcoldfire__ |
| cfi_adjust_cfa_offset (20) |
| #else |
| cfi_adjust_cfa_offset (24) |
| #endif |
| 1: move.l %a2, (%sp) |
| cfi_rel_offset (%a2, 0) |
| move.l %sp, %a2 |
| move.l %sp, %a0 |
| lea 28(%sp), %a1 |
| | Round framesize up to longword alignment |
| addq.l #3, %d1 |
| and.l #-3, %d1 |
| sub.l %d1, %a0 |
| move.l %a0, %sp |
| cfi_def_cfa_register (%a2) |
| #ifdef __mcoldfire__ |
| tst.l %d1 |
| beq 2f |
| 1: move.l (%a1)+, (%a0)+ |
| subq.l #4,%d1 |
| bne 1b |
| 2: |
| #else |
| lsr.l #2,%d1 |
| jra 2f |
| 1: move.l (%a1)+, (%a0)+ |
| 2: dbra %d1,1b |
| #endif |
| /* |
| %a2+24 return address |
| %a2+20 PLT1 |
| %a2+16 PLT2 |
| %a2+12 %sp |
| %a2+8 %a1 |
| %a2+4 %a0 |
| %a2 %a2 |
| %sp copied stack frame |
| */ |
| |
| move.l 4(%a2), %a0 |
| move.l 8(%a2), %a1 |
| #ifdef __mcoldfire__ |
| pea 2f(%pc) |
| move.l %d0,-(%sp) |
| rts |
| 2: |
| #else |
| jsr (%d0) |
| #endif |
| move.l %a2, %sp |
| cfi_def_cfa_register (%sp) |
| move.l (%sp)+, %a2 |
| cfi_adjust_cfa_offset (4) |
| cfi_restore (%a2) |
| /* |
| +20 return address |
| +16 PLT1 |
| +12 PLT2 |
| +8 %sp |
| +4 %a1 |
| %sp %a0 |
| */ |
| #ifdef FMOVE |
| FMOVE %fp0, -(%sp) |
| cfi_adjust_cfa_offset (FPSPACE) |
| #endif |
| move.l %a0, -(%sp) |
| cfi_adjust_cfa_offset (4) |
| move.l %d1, -(%sp) |
| cfi_adjust_cfa_offset (4) |
| move.l %d0, -(%sp) |
| cfi_adjust_cfa_offset (4) |
| pea (%sp) |
| cfi_adjust_cfa_offset (4) |
| pea (16+FPSPACE)(%sp) |
| cfi_adjust_cfa_offset (4) |
| move.l (32+FPSPACE)(%sp), -(%sp) |
| cfi_adjust_cfa_offset (4) |
| move.l (32+FPSPACE)(%sp), -(%sp) |
| cfi_adjust_cfa_offset (4) |
| jbsr _dl_call_pltexit |
| lea 16(%sp), %sp |
| cfi_adjust_cfa_offset (-16) |
| move.l (%sp)+, %d0 |
| cfi_adjust_cfa_offset (-4) |
| move.l (%sp)+, %d1 |
| cfi_adjust_cfa_offset (-4) |
| move.l (%sp)+, %a0 |
| cfi_adjust_cfa_offset (-4) |
| #ifdef FMOVE |
| FMOVE (%sp)+, %fp0 |
| cfi_adjust_cfa_offset (-FPSPACE) |
| #endif |
| lea 20(%sp), %sp |
| cfi_adjust_cfa_offset (-20) |
| rts |
| cfi_endproc |
| .size _dl_runtime_profile, . - _dl_runtime_profile |