1 /* Special support for trampolines
3 * Copyright
(C
) 1996, 1997, 2000 Free Software Foundation
, Inc.
4 * Written By Michael Meissner
6 * This file is free software
; you can redistribute it and/or modify it
7 * under the terms of the GNU General
Public License as published by the
8 * Free Software Foundation
; either version 2, or (at your option) any
11 * In addition to the permissions
in the GNU General
Public License
, the
12 * Free Software Foundation gives you unlimited permission to link the
13 * compiled version of
this file with other programs
, and to distribute
14 * those programs without any restriction coming from the use of
this
15 * file.
(The General
Public License restrictions do apply
in other
16 * respects
; for example, they cover modification of the file, and
17 * distribution when
not linked
into another program.
)
19 * This file is distributed
in the hope that it will be useful
, but
20 * WITHOUT ANY WARRANTY
; without even the implied warranty of
21 * MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
22 * General
Public License for more details.
24 * You should have received a copy of the GNU General
Public License
25 * along with
this program
; see the file COPYING. If not, write to
26 * the Free Software Foundation
, 51 Franklin Street
, Fifth Floor
,
27 * Boston
, MA
02110-1301, USA.
29 * As a special exception
, if you link
this library with files
30 * compiled with GCC to produce an executable
, this does
not cause
31 * the resulting executable to be covered by the GNU General
Public License.
32 * This exception does
not however invalidate any other reasons why
33 * the executable file might be covered by the GNU General
Public License.
36 /* Set up trampolines.
*/
43 .
type trampoline_initial
,@object
48 .Lfunc
= .
-trampoline_initial
49 .long
0 /* will be replaced with function address
*/
50 .Lchain
= .
-trampoline_initial
51 .long
0 /* will be replaced with static chain
*/
54 lwz r0
,0(r11
) /* function address
*/
55 lwz r11
,4(r11
) /* static chain
*/
59 trampoline_size
= .
-trampoline_initial
60 .
size trampoline_initial
,trampoline_size
63 /* R3
= stack address to store trampoline
*/
64 /* R4
= length of trampoline area
*/
65 /* R5
= function address
*/
66 /* R6
= static chain
*/
68 FUNC_START
(__trampoline_setup
)
69 mflr r0
/* save return address
*/
70 bcl
20,31,.LCF0
/* load up __trampoline_initial
into r7
*/
73 addi r7
,r11
,trampoline_initial
-4-.LCF0
/* trampoline address
-4 */
75 li r8
,trampoline_size
/* verify that the trampoline is big enough
*/
77 srwi r4
,r4
,2 /* # words to move
*/
78 addi r9
,r3
,-4 /* adjust pointer for lwzu
*/
84 /* Copy the instructions to the stack
*/
90 /* Store correct function
and static chain
*/
94 /* Now flush both caches
*/
102 /* Finally synchronize things
& return
*/
108 #if defined SHARED
&& defined HAVE_AS_REL16
111 addis r30
,r30
,_GLOBAL_OFFSET_TABLE_
-1b@ha
112 addi r30
,r30
,_GLOBAL_OFFSET_TABLE_
-1b@l
114 bl JUMP_TARGET
(abort
)
115 FUNC_END
(__trampoline_setup
)