]>
Commit | Line | Data |
---|---|---|
c4029823 | 1 | /* Copyright (C) 1993, 1995, 1996 Free Software Foundation, Inc. |
28f540f4 RM |
2 | Contributed by Brendan Kehoe (brendan@zen.org). |
3 | ||
4 | The GNU C Library is free software; you can redistribute it and/or | |
5 | modify it under the terms of the GNU Library General Public License as | |
6 | published by the Free Software Foundation; either version 2 of the | |
7 | License, or (at your option) any later version. | |
8 | ||
9 | The GNU C Library is distributed in the hope that it will be useful, | |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
12 | Library General Public License for more details. | |
13 | ||
14 | You should have received a copy of the GNU Library General Public | |
15 | License along with the GNU C Library; see the file COPYING.LIB. If | |
16 | not, write to the Free Software Foundation, Inc., 675 Mass Ave, | |
17 | Cambridge, MA 02139, USA. */ | |
18 | ||
19 | #include <sysdep.h> | |
20 | ||
c4029823 | 21 | __errno: |
28f540f4 RM |
22 | .comm errno, 4 |
23 | ||
24 | ENTRY(__start) | |
25 | .set noreorder | |
26 | ||
27 | /* The first thing on the stack is argc. */ | |
28 | lw s0, 0(sp) | |
29 | nop | |
30 | ||
31 | /* Set up the global pointer. */ | |
32 | la gp, _gp | |
33 | ||
34 | /* Then set up argv. */ | |
35 | addiu s1, sp, 4 | |
36 | ||
37 | /* To compute where envp is, first we have to jump ahead four | |
38 | bytes from what argv was. This will bring us ahead, so we don't | |
39 | need to compute the NULL at the end of argv later. */ | |
40 | addiu v1, s1, 4 | |
41 | ||
42 | /* Now, compute the space to skip given the number of arguments | |
43 | we've got. We do this by multiplying argc by 4. */ | |
44 | sll v0, s0, 2 | |
45 | ||
46 | /* Now, add (argv+4) with the space to skip...that's envp. */ | |
47 | addu s2, v1, v0 | |
48 | ||
49 | /* __environ = envp; */ | |
50 | sw s2, __environ | |
51 | ||
52 | addiu sp, sp, -24 | |
53 | ||
54 | /* __libc_init (argc, argv, envp); */ | |
55 | move a0, s0 | |
56 | move a1, s1 | |
57 | jal __libc_init | |
58 | move a2, s2 | |
59 | ||
60 | /* errno = 0; */ | |
61 | sw zero, errno | |
62 | ||
63 | /* exit (main (argc, argv, envp)); */ | |
64 | move a0, s0 | |
65 | move a1, s1 | |
66 | jal main | |
67 | move a2, s2 | |
68 | ||
69 | /* Make the value returned by main be the argument to exit. */ | |
70 | jal exit | |
71 | move a0, v0 | |
77162807 | 72 | .end __start |