Commit | Line | Data |
---|---|---|
1136f72d PR |
1 | /* |
2 | * Copyright (c) 1993 Paul Kranenburg | |
3 | * All rights reserved. | |
4 | * | |
5 | * Redistribution and use in source and binary forms, with or without | |
6 | * modification, are permitted provided that the following conditions | |
7 | * are met: | |
8 | * 1. Redistributions of source code must retain the above copyright | |
9 | * notice, this list of conditions and the following disclaimer. | |
10 | * 2. Redistributions in binary form must reproduce the above copyright | |
11 | * notice, this list of conditions and the following disclaimer in the | |
12 | * documentation and/or other materials provided with the distribution. | |
13 | * 3. All advertising materials mentioning features or use of this software | |
14 | * must display the following acknowledgement: | |
15 | * This product includes software developed by Paul Kranenburg. | |
16 | * 4. The name of the author may not be used to endorse or promote products | |
17 | * derived from this software withough specific prior written permission | |
18 | * | |
19 | * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR | |
20 | * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |
21 | * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. | |
22 | * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, | |
23 | * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT | |
24 | * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
25 | * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
26 | * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
27 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | |
28 | * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
29 | * | |
30 | * $Id: mdprologue.S,v 1.1 1993/10/16 21:53:16 pk Exp $ | |
31 | */ | |
32 | ||
33 | /* | |
34 | * i386 run-time link editor entry points. | |
35 | */ | |
36 | ||
37 | #include <sys/syscall.h> | |
38 | #define LCALL(x,y) .byte 0x9a ; .long y; .word x | |
39 | ||
40 | .text | |
41 | .globl _binder, _binder_entry | |
42 | ||
43 | /* | |
44 | * _rtl(int version, struct crt_ldso *crtp) | |
45 | */ | |
46 | #define FRAME 12 /* Size of stack frame */ | |
47 | ||
48 | ||
49 | _rtl: # crt0 calls us here | |
50 | pushl %ebp # Allocate stack frame | |
51 | movl %esp, %ebp | |
52 | subl $FRAME, %esp | |
53 | pushl %ebx | |
54 | call 1f # PIC function prologue | |
55 | 1: | |
56 | popl %ebx | |
57 | addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %ebx | |
58 | ||
59 | movl 12(%ebp), %eax # Extract data from interface structure | |
60 | movl (%eax),%eax # base address of ld.so (first field) | |
61 | # setup arguments for rtld() | |
62 | movl (%ebx), %ecx # 1st entry in GOT is our __DYNAMIC | |
63 | addl %eax, %ecx # add load address | |
64 | pushl %ecx # 3rd arg | |
65 | pushl 12(%ebp) # 2nd arg == &crt. | |
66 | pushl 8(%ebp) # 1st arg == version | |
67 | addl _rtld@GOT(%ebx), %eax # relocate address of function | |
68 | call %eax # _rtld(version, crtp, DYNAMIC) | |
69 | addl $12,%esp # pop arguments | |
70 | ||
71 | movl (-FRAME-4)(%ebp), %ebx # restore %ebx | |
72 | leave # remove stack frame, | |
73 | ret # let's rock | |
74 | ||
75 | # First call to a procedure generally comes through here for | |
76 | # binding. | |
77 | ||
78 | _binder_entry: | |
79 | pushl %ebp # setup a stack frame | |
80 | movl %esp, %ebp | |
81 | pusha # save all regs | |
82 | ||
83 | movl $0, %eax # clear | |
84 | movl 4(%ebp), %esi # return address in PLT | |
85 | movw (%esi), %ax # get hold of relocation number | |
86 | subl $6, %esi # make it point to the jmpslot | |
87 | ||
88 | pushl %eax # pushd arguments | |
89 | pushl %esi # | |
90 | call _binder@PLT # _binder(rpc, index) | |
91 | addl $8, %esp # pop arguments | |
92 | movl %eax, 4(%ebp) # return value from _binder() == actual | |
93 | # address of function | |
94 | popa # restore regs | |
95 | leave # remove our stack frame | |
96 | ret | |
97 | ||
98 | # Special system call stubs which return real and effective user and group | |
99 | # id's. Saves overhead of making separate calls for each. | |
100 | # !! Relies on compatability option in BSD 4.three-and-a-half | |
101 | ||
102 | .globl _getreuid, _getregid | |
103 | _getreuid: | |
104 | lea SYS_getuid, %eax | |
105 | LCALL(7,0) | |
106 | jc out | |
107 | movl 4(%esp), %ecx # get 1st arg | |
108 | movl %eax, (%ecx) # put value in it | |
109 | movl 8(%esp), %ecx # same for 2nd arg | |
110 | movl %edx, (%ecx) # | |
111 | ret # done | |
112 | ||
113 | _getregid: | |
114 | lea SYS_getgid, %eax | |
115 | LCALL(7,0) | |
116 | jc out | |
117 | movl 4(%esp), %ecx # get 1st arg | |
118 | movl %eax, (%ecx) # put value in it | |
119 | movl 8(%esp), %ecx # same for 2nd arg | |
120 | movl %edx, (%ecx) # | |
121 | ret # done | |
122 | ||
123 | out: jmp cerror@PLT # Call common error routine | |
124 |