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
, 59 Temple Place
- Suite
330,
27 * Boston
, MA
02111-1307, 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 the
31 * resulting executable to be covered by the GNU General
Public License.
32 * This exception does
not however invalidate any other reasons why the
33 * executable file might be covered by the GNU General
Public License.
36 /* Set up trampolines.
*/
43 Lfunc
= .
-Ltrampoline_initial
44 .long
0 /* will be replaced with function address
*/
45 Lchain
= .
-Ltrampoline_initial
46 .long
0 /* will be replaced with static chain
*/
48 lwz r12
,0(r11
) /* function address
*/
51 lwz r11
,4(r11
) /* static chain
*/
54 trampoline_size
= .
-Ltrampoline_initial
56 /* R3
= stack address to store trampoline
*/
57 /* R4
= length of trampoline area
*/
58 /* R5
= function address
*/
59 /* R6
= static chain
*/
61 .globl ___trampoline_setup
63 mflr r0
/* save return address
*/
64 bcl
20,31,LCF0
/* load up __trampoline_initial
into r7
*/
67 addi r7
,r11
,ha16
(LTRAMP
-LCF0
)
68 lwz r7
,lo16
(LTRAMP
-LCF0
)(r7
)
70 li r8
,trampoline_size
/* verify trampoline big enough
*/
72 srwi r4
,r4
,2 /* # words to move
*/
73 addi r9
,r3
,-4 /* adjust pointer for lwzu
*/
79 /* Copy the instructions to the stack
*/
85 /* Store correct function
and static chain
*/
89 /* Now flush both caches
*/
97 /* Finally synchronize things
& return
*/
108 .indirect_symbol _abort
113 addis r11
,r11
,ha16
(L_abort$lazy_ptr
-L0$_abort
)
115 lwz r12
,lo16
(L_abort$lazy_ptr
-L0$_abort
)(r11
)
117 addi r11
,r11
,lo16
(L_abort$lazy_ptr
-L0$_abort
)
122 .indirect_symbol _abort
123 .long dyld_stub_binding_helper
130 .long Ltrampoline_initial