Patrick Welche <prlw1@cam.ac.uk>
[netbsd-mini2440.git] / libexec / ld.aout_so / arch / arm32 / mdprologue.S
blobe3d004c6f3e47f3f57f907dcc899ed3a97934299
1 /*      $NetBSD$        */
3 /*
4  * Copyright (C) 1996 Wolfgang Solfrank
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  * 3. All advertising materials mentioning features or use of this software
15  *    must display the following acknowledgement:
16  *      This product includes software developed by Wolfgang Solfrank.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
34  * arm run-time link editor entry points.
35  */
37 #include <machine/asm.h>
38 #include <sys/syscall.h>
40         .text
43  *      _rtl(int version, struct crt_ldso *crtp)
44  */
46         .align  0
47         .type   _rtl,#function
48 _rtl:                                   @ crt0 calls us here
49         mov     ip, sp                  @ Allocate stack frame
50         stmfd   sp!, {sl, fp, ip, lr, pc}
51         sub     fp, ip, #4
53         ldr     r3, [r1, #0]            @ base address of ld.so (first field)
54                                         @ setup arguments for rtld()
55         ldr     sl, GOTaddr             @ get pc-rel offset for GOT
56         add     sl, pc, sl              @ here is the GOT
57 L1:
58         ldr     r2, DYNAMICaddr
59         ldr     r2, [sl, r2]            @ 1st entry in GOT is our __DYNAMIC
60         add     r2, r2, r3              @   add load address
61         ldr     lr, rtldaddr            @ get GOT offset for function
62         ldr     lr, [sl, lr]            @ get function address
63         add     r3, lr, r3              @   and relocate
64         mov     lr, pc
65         mov     pc, r3                  @ _rtld(version, crtp, DYNAMIC)
67         ldmea   fp, {sl, fp, ip, pc}
69         .align  0
70 GOTaddr:
71         .word   __GLOBAL_OFFSET_TABLE_ + (. - (L1+4) )
72 DYNAMICaddr:
73         .word   __DYNAMIC
74 rtldaddr:
75         .word   _rtld
77  @ First call to a procedure generally comes through here for
78  @ binding.
80 ENTRY(binder_entry)
81         stmfd   sp!, {r0-fp, ip, lr, pc} @ save all regs in standard frame
82                                         @   (ip and lr to be fixed later)
83         add     fp, sp, #(15-1)*4       @ get new fp
84         add     r0, fp, #4              @ compute old sp
85         str     r0, [fp, #-8]           @ fixup saved ip
87         sub     r0, ip, #(8+12)         @ make it point to the jmpslot
89         bl      _binder
90         str     r0, [fp]                @ return value from _binder()
91                                         @   == actual address of function
92         ldmfa   fp, {r0-fp, sp, lr, pc} @ restore regs