annotate src/ecrt0.c @ 82622:fde565f809da

Move refcards from etc/ to etc/refcards/
author Glenn Morris <rgm@gnu.org>
date Wed, 22 Aug 2007 07:17:48 +0000
parents 922696f363b0
children fc2bcd2a8aad f55f9811f5d7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
25844
Dave Love <fx@gnu.org>
parents:
diff changeset
1 /* C code startup routine.
75227
e90d04cd455a Update copyright for years from Emacs 21 to present (mainly adding
Glenn Morris <rgm@gnu.org>
parents: 68651
diff changeset
2 Copyright (C) 1985, 1986, 1992, 2001, 2002, 2003, 2004,
75348
3d45362f1d38 Add 2007 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 75227
diff changeset
3 2005, 2006, 2007 Free Software Foundation, Inc.
25844
Dave Love <fx@gnu.org>
parents:
diff changeset
4
Dave Love <fx@gnu.org>
parents:
diff changeset
5 This file is part of GNU Emacs.
Dave Love <fx@gnu.org>
parents:
diff changeset
6
Dave Love <fx@gnu.org>
parents:
diff changeset
7 GNU Emacs is free software; you can redistribute it and/or modify
Dave Love <fx@gnu.org>
parents:
diff changeset
8 it under the terms of the GNU General Public License as published by
78260
922696f363b0 Switch license to GPLv3 or later.
Glenn Morris <rgm@gnu.org>
parents: 75348
diff changeset
9 the Free Software Foundation; either version 3, or (at your option)
25844
Dave Love <fx@gnu.org>
parents:
diff changeset
10 any later version.
Dave Love <fx@gnu.org>
parents:
diff changeset
11
Dave Love <fx@gnu.org>
parents:
diff changeset
12 GNU Emacs is distributed in the hope that it will be useful,
Dave Love <fx@gnu.org>
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
Dave Love <fx@gnu.org>
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Dave Love <fx@gnu.org>
parents:
diff changeset
15 GNU General Public License for more details.
Dave Love <fx@gnu.org>
parents:
diff changeset
16
Dave Love <fx@gnu.org>
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
Dave Love <fx@gnu.org>
parents:
diff changeset
18 along with GNU Emacs; see the file COPYING. If not, write to
64084
a8fa7c632ee4 Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 52401
diff changeset
19 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
a8fa7c632ee4 Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 52401
diff changeset
20 Boston, MA 02110-1301, USA. */
25844
Dave Love <fx@gnu.org>
parents:
diff changeset
21
Dave Love <fx@gnu.org>
parents:
diff changeset
22
Dave Love <fx@gnu.org>
parents:
diff changeset
23 /* The standard Vax 4.2 Unix crt0.c cannot be used for Emacs
Dave Love <fx@gnu.org>
parents:
diff changeset
24 because it makes `environ' an initialized variable.
Dave Love <fx@gnu.org>
parents:
diff changeset
25 It is easiest to have a special crt0.c on all machines
Dave Love <fx@gnu.org>
parents:
diff changeset
26 though I don't know whether other machines actually need it. */
Dave Love <fx@gnu.org>
parents:
diff changeset
27
Dave Love <fx@gnu.org>
parents:
diff changeset
28 /* On the vax and 68000, in BSD4.2 and USG5.2,
Dave Love <fx@gnu.org>
parents:
diff changeset
29 this is the data format on startup:
Dave Love <fx@gnu.org>
parents:
diff changeset
30 (vax) ap and fp are unpredictable as far as I know; don't use them.
Dave Love <fx@gnu.org>
parents:
diff changeset
31 sp -> word containing argc
Dave Love <fx@gnu.org>
parents:
diff changeset
32 word pointing to first arg string
Dave Love <fx@gnu.org>
parents:
diff changeset
33 [word pointing to next arg string]... 0 or more times
Dave Love <fx@gnu.org>
parents:
diff changeset
34 0
Dave Love <fx@gnu.org>
parents:
diff changeset
35 Optionally:
Dave Love <fx@gnu.org>
parents:
diff changeset
36 [word pointing to environment variable]... 1 or more times
Dave Love <fx@gnu.org>
parents:
diff changeset
37 ...
Dave Love <fx@gnu.org>
parents:
diff changeset
38 0
Dave Love <fx@gnu.org>
parents:
diff changeset
39 And always:
Dave Love <fx@gnu.org>
parents:
diff changeset
40 first arg string
Dave Love <fx@gnu.org>
parents:
diff changeset
41 [next arg string]... 0 or more times
Dave Love <fx@gnu.org>
parents:
diff changeset
42 */
Dave Love <fx@gnu.org>
parents:
diff changeset
43
Dave Love <fx@gnu.org>
parents:
diff changeset
44 /* On the 16000, at least in the one 4.2 system I know about,
Dave Love <fx@gnu.org>
parents:
diff changeset
45 the initial data format is
Dave Love <fx@gnu.org>
parents:
diff changeset
46 sp -> word containing argc
Dave Love <fx@gnu.org>
parents:
diff changeset
47 word containing argp
Dave Love <fx@gnu.org>
parents:
diff changeset
48 word pointing to first arg string, and so on as above
Dave Love <fx@gnu.org>
parents:
diff changeset
49 */
Dave Love <fx@gnu.org>
parents:
diff changeset
50
Dave Love <fx@gnu.org>
parents:
diff changeset
51 #ifdef emacs
Dave Love <fx@gnu.org>
parents:
diff changeset
52 #include <config.h>
Dave Love <fx@gnu.org>
parents:
diff changeset
53 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
54
Dave Love <fx@gnu.org>
parents:
diff changeset
55 /* ******** WARNING ********
Dave Love <fx@gnu.org>
parents:
diff changeset
56 Do not insert any data definitions before data_start!
Dave Love <fx@gnu.org>
parents:
diff changeset
57 Since this is the first file linked, the address of the following
Dave Love <fx@gnu.org>
parents:
diff changeset
58 variable should correspond to the start of initialized data space.
Dave Love <fx@gnu.org>
parents:
diff changeset
59 On some systems this is a constant that is independent of the text
Dave Love <fx@gnu.org>
parents:
diff changeset
60 size for shared executables. On others, it is a function of the
Dave Love <fx@gnu.org>
parents:
diff changeset
61 text size. In short, this seems to be the most portable way to
Dave Love <fx@gnu.org>
parents:
diff changeset
62 discover the start of initialized data space dynamically at runtime,
Dave Love <fx@gnu.org>
parents:
diff changeset
63 for either shared or unshared executables, on either swapping or
Dave Love <fx@gnu.org>
parents:
diff changeset
64 virtual systems. It only requires that the linker allocate objects
Dave Love <fx@gnu.org>
parents:
diff changeset
65 in the order encountered, a reasonable model for most Unix systems.
Dave Love <fx@gnu.org>
parents:
diff changeset
66 Similarly, note that the address of _start() should be the start
Dave Love <fx@gnu.org>
parents:
diff changeset
67 of text space. Fred Fish, UniSoft Systems Inc. */
Dave Love <fx@gnu.org>
parents:
diff changeset
68
Dave Love <fx@gnu.org>
parents:
diff changeset
69 int data_start = 0;
Dave Love <fx@gnu.org>
parents:
diff changeset
70
Dave Love <fx@gnu.org>
parents:
diff changeset
71 #ifdef NEED_ERRNO
Dave Love <fx@gnu.org>
parents:
diff changeset
72 int errno;
Dave Love <fx@gnu.org>
parents:
diff changeset
73 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
74
Dave Love <fx@gnu.org>
parents:
diff changeset
75 #ifndef DONT_NEED_ENVIRON
Dave Love <fx@gnu.org>
parents:
diff changeset
76 char **environ;
Dave Love <fx@gnu.org>
parents:
diff changeset
77 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
78
Dave Love <fx@gnu.org>
parents:
diff changeset
79 #ifndef static
Dave Love <fx@gnu.org>
parents:
diff changeset
80 /* On systems where the static storage class is usable, this function
Dave Love <fx@gnu.org>
parents:
diff changeset
81 should be declared as static. Otherwise, the static keyword has
Dave Love <fx@gnu.org>
parents:
diff changeset
82 been defined to be something else, and code for those systems must
Dave Love <fx@gnu.org>
parents:
diff changeset
83 take care of this declaration appropriately. */
Dave Love <fx@gnu.org>
parents:
diff changeset
84 static start1 ();
Dave Love <fx@gnu.org>
parents:
diff changeset
85 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
86
Dave Love <fx@gnu.org>
parents:
diff changeset
87 #ifdef APOLLO
Dave Love <fx@gnu.org>
parents:
diff changeset
88 extern char *malloc(), *realloc(), *(*_libc_malloc) (), *(*_libc_realloc)();
Dave Love <fx@gnu.org>
parents:
diff changeset
89 extern void free(), (*_libc_free) (); extern int main();
Dave Love <fx@gnu.org>
parents:
diff changeset
90 std_$call void unix_$main();
Dave Love <fx@gnu.org>
parents:
diff changeset
91
Dave Love <fx@gnu.org>
parents:
diff changeset
92 _start()
Dave Love <fx@gnu.org>
parents:
diff changeset
93 {
Dave Love <fx@gnu.org>
parents:
diff changeset
94 _libc_malloc = malloc;
Dave Love <fx@gnu.org>
parents:
diff changeset
95 _libc_realloc = realloc;
Dave Love <fx@gnu.org>
parents:
diff changeset
96 _libc_free = free;
Dave Love <fx@gnu.org>
parents:
diff changeset
97 unix_$main(main); /* no return */
Dave Love <fx@gnu.org>
parents:
diff changeset
98 }
Dave Love <fx@gnu.org>
parents:
diff changeset
99 #endif /* APOLLO */
Dave Love <fx@gnu.org>
parents:
diff changeset
100
Dave Love <fx@gnu.org>
parents:
diff changeset
101 #if defined(orion) || defined(pyramid) || defined(celerity) || defined(ALLIANT) || defined(clipper) || defined(sps7)
Dave Love <fx@gnu.org>
parents:
diff changeset
102
Dave Love <fx@gnu.org>
parents:
diff changeset
103 #if defined(sps7) && defined(V3x)
Dave Love <fx@gnu.org>
parents:
diff changeset
104 asm(" section 10");
Dave Love <fx@gnu.org>
parents:
diff changeset
105 asm(" ds.b 0xb0");
Dave Love <fx@gnu.org>
parents:
diff changeset
106 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
107
Dave Love <fx@gnu.org>
parents:
diff changeset
108 #ifdef ALLIANT
Dave Love <fx@gnu.org>
parents:
diff changeset
109 /* _start must initialize _curbrk and _minbrk on the first startup;
Dave Love <fx@gnu.org>
parents:
diff changeset
110 when starting up after dumping, it must initialize them to what they were
Dave Love <fx@gnu.org>
parents:
diff changeset
111 before the dumping, since they are in the shared library and
Dave Love <fx@gnu.org>
parents:
diff changeset
112 are not dumped. See ADJUST_EXEC_HEADER in m-alliant.h. */
Dave Love <fx@gnu.org>
parents:
diff changeset
113 extern unsigned char *_curbrk, *_minbrk;
Dave Love <fx@gnu.org>
parents:
diff changeset
114 extern unsigned char end;
Dave Love <fx@gnu.org>
parents:
diff changeset
115 unsigned char *_setbrk = &end;
Dave Love <fx@gnu.org>
parents:
diff changeset
116 #ifdef ALLIANT_2800
Dave Love <fx@gnu.org>
parents:
diff changeset
117 unsigned char *_end = &end;
Dave Love <fx@gnu.org>
parents:
diff changeset
118 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
119 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
120
Dave Love <fx@gnu.org>
parents:
diff changeset
121 #ifndef DUMMIES
Dave Love <fx@gnu.org>
parents:
diff changeset
122 #define DUMMIES
Dave Love <fx@gnu.org>
parents:
diff changeset
123 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
124
Dave Love <fx@gnu.org>
parents:
diff changeset
125 _start (DUMMIES argc, argv, envp)
Dave Love <fx@gnu.org>
parents:
diff changeset
126 int argc;
Dave Love <fx@gnu.org>
parents:
diff changeset
127 char **argv, **envp;
Dave Love <fx@gnu.org>
parents:
diff changeset
128 {
Dave Love <fx@gnu.org>
parents:
diff changeset
129 #ifdef ALLIANT
Dave Love <fx@gnu.org>
parents:
diff changeset
130 #ifdef ALLIANT_2800
Dave Love <fx@gnu.org>
parents:
diff changeset
131 _curbrk = _end;
Dave Love <fx@gnu.org>
parents:
diff changeset
132 _minbrk = _end;
Dave Love <fx@gnu.org>
parents:
diff changeset
133 #else
Dave Love <fx@gnu.org>
parents:
diff changeset
134 _curbrk = _setbrk;
Dave Love <fx@gnu.org>
parents:
diff changeset
135 _minbrk = _setbrk;
Dave Love <fx@gnu.org>
parents:
diff changeset
136 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
137 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
138
Dave Love <fx@gnu.org>
parents:
diff changeset
139 environ = envp;
Dave Love <fx@gnu.org>
parents:
diff changeset
140
Dave Love <fx@gnu.org>
parents:
diff changeset
141 exit (main (argc, argv, envp));
Dave Love <fx@gnu.org>
parents:
diff changeset
142 }
Dave Love <fx@gnu.org>
parents:
diff changeset
143
Dave Love <fx@gnu.org>
parents:
diff changeset
144 #endif /* orion or pyramid or celerity or alliant or clipper */
Dave Love <fx@gnu.org>
parents:
diff changeset
145
Dave Love <fx@gnu.org>
parents:
diff changeset
146 #if defined (ns16000) && !defined (sequent) && !defined (UMAX) && !defined (CRT0_DUMMIES)
Dave Love <fx@gnu.org>
parents:
diff changeset
147
Dave Love <fx@gnu.org>
parents:
diff changeset
148 _start ()
Dave Love <fx@gnu.org>
parents:
diff changeset
149 {
Dave Love <fx@gnu.org>
parents:
diff changeset
150 /* On 16000, _start pushes fp onto stack */
Dave Love <fx@gnu.org>
parents:
diff changeset
151 start1 ();
Dave Love <fx@gnu.org>
parents:
diff changeset
152 }
Dave Love <fx@gnu.org>
parents:
diff changeset
153
Dave Love <fx@gnu.org>
parents:
diff changeset
154 /* ignore takes care of skipping the fp value pushed in start. */
Dave Love <fx@gnu.org>
parents:
diff changeset
155 static
Dave Love <fx@gnu.org>
parents:
diff changeset
156 start1 (ignore, argc, argv)
Dave Love <fx@gnu.org>
parents:
diff changeset
157 int ignore;
Dave Love <fx@gnu.org>
parents:
diff changeset
158 int argc;
Dave Love <fx@gnu.org>
parents:
diff changeset
159 register char **argv;
Dave Love <fx@gnu.org>
parents:
diff changeset
160 {
Dave Love <fx@gnu.org>
parents:
diff changeset
161 environ = argv + argc + 1;
Dave Love <fx@gnu.org>
parents:
diff changeset
162
Dave Love <fx@gnu.org>
parents:
diff changeset
163 if (environ == *argv)
Dave Love <fx@gnu.org>
parents:
diff changeset
164 environ--;
Dave Love <fx@gnu.org>
parents:
diff changeset
165 exit (main (argc, argv, environ));
Dave Love <fx@gnu.org>
parents:
diff changeset
166 }
Dave Love <fx@gnu.org>
parents:
diff changeset
167 #endif /* ns16000, not sequent and not UMAX, and not the CRT0_DUMMIES method */
Dave Love <fx@gnu.org>
parents:
diff changeset
168
Dave Love <fx@gnu.org>
parents:
diff changeset
169 #ifdef UMAX
Dave Love <fx@gnu.org>
parents:
diff changeset
170 _start()
Dave Love <fx@gnu.org>
parents:
diff changeset
171 {
Dave Love <fx@gnu.org>
parents:
diff changeset
172 asm(" exit [] # undo enter");
Dave Love <fx@gnu.org>
parents:
diff changeset
173 asm(" .set exitsc,1");
Dave Love <fx@gnu.org>
parents:
diff changeset
174 asm(" .set sigcatchall,0x400");
Dave Love <fx@gnu.org>
parents:
diff changeset
175
Dave Love <fx@gnu.org>
parents:
diff changeset
176 asm(" .globl _exit");
Dave Love <fx@gnu.org>
parents:
diff changeset
177 asm(" .globl start");
Dave Love <fx@gnu.org>
parents:
diff changeset
178 asm(" .globl __start");
Dave Love <fx@gnu.org>
parents:
diff changeset
179 asm(" .globl _main");
Dave Love <fx@gnu.org>
parents:
diff changeset
180 asm(" .globl _environ");
Dave Love <fx@gnu.org>
parents:
diff changeset
181 asm(" .globl _sigvec");
Dave Love <fx@gnu.org>
parents:
diff changeset
182 asm(" .globl sigentry");
Dave Love <fx@gnu.org>
parents:
diff changeset
183
Dave Love <fx@gnu.org>
parents:
diff changeset
184 asm("start:");
Dave Love <fx@gnu.org>
parents:
diff changeset
185 asm(" br .xstart");
Dave Love <fx@gnu.org>
parents:
diff changeset
186 asm(" .org 0x20");
Dave Love <fx@gnu.org>
parents:
diff changeset
187 asm(" .double p_glbl,0,0xf00000,0");
Dave Love <fx@gnu.org>
parents:
diff changeset
188 asm(" .org 0x30");
Dave Love <fx@gnu.org>
parents:
diff changeset
189 asm(".xstart:");
Dave Love <fx@gnu.org>
parents:
diff changeset
190 asm(" adjspb $8");
Dave Love <fx@gnu.org>
parents:
diff changeset
191 asm(" movd 8(sp),0(sp) # argc");
Dave Love <fx@gnu.org>
parents:
diff changeset
192 asm(" addr 12(sp),r0");
Dave Love <fx@gnu.org>
parents:
diff changeset
193 asm(" movd r0,4(sp) # argv");
Dave Love <fx@gnu.org>
parents:
diff changeset
194 asm("L1:");
Dave Love <fx@gnu.org>
parents:
diff changeset
195 asm(" movd r0,r1");
Dave Love <fx@gnu.org>
parents:
diff changeset
196 asm(" addqd $4,r0");
Dave Love <fx@gnu.org>
parents:
diff changeset
197 asm(" cmpqd $0,0(r1) # null args term ?");
Dave Love <fx@gnu.org>
parents:
diff changeset
198 asm(" bne L1");
Dave Love <fx@gnu.org>
parents:
diff changeset
199 asm(" cmpd r0,0(4(sp)) # end of 'env' or 'argv' ?");
Dave Love <fx@gnu.org>
parents:
diff changeset
200 asm(" blt L2");
Dave Love <fx@gnu.org>
parents:
diff changeset
201 asm(" addqd $-4,r0 # envp's are in list");
Dave Love <fx@gnu.org>
parents:
diff changeset
202 asm("L2:");
Dave Love <fx@gnu.org>
parents:
diff changeset
203 asm(" movd r0,8(sp) # env");
Dave Love <fx@gnu.org>
parents:
diff changeset
204 asm(" movd r0,@_environ # indir is 0 if no env ; not 0 if env");
Dave Love <fx@gnu.org>
parents:
diff changeset
205 asm(" movqd $0,tos # setup intermediate signal handler");
Dave Love <fx@gnu.org>
parents:
diff changeset
206 asm(" addr @sv,tos");
Dave Love <fx@gnu.org>
parents:
diff changeset
207 asm(" movzwd $sigcatchall,tos");
Dave Love <fx@gnu.org>
parents:
diff changeset
208 asm(" jsr @_sigvec");
Dave Love <fx@gnu.org>
parents:
diff changeset
209 asm(" adjspb $-12");
Dave Love <fx@gnu.org>
parents:
diff changeset
210 asm(" jsr @_main");
Dave Love <fx@gnu.org>
parents:
diff changeset
211 asm(" adjspb $-12");
Dave Love <fx@gnu.org>
parents:
diff changeset
212 asm(" movd r0,tos");
Dave Love <fx@gnu.org>
parents:
diff changeset
213 asm(" jsr @_exit");
Dave Love <fx@gnu.org>
parents:
diff changeset
214 asm(" adjspb $-4");
Dave Love <fx@gnu.org>
parents:
diff changeset
215 asm(" addr @exitsc,r0");
Dave Love <fx@gnu.org>
parents:
diff changeset
216 asm(" svc");
Dave Love <fx@gnu.org>
parents:
diff changeset
217 asm(" .align 4 # sigvec arg");
Dave Love <fx@gnu.org>
parents:
diff changeset
218 asm("sv:");
Dave Love <fx@gnu.org>
parents:
diff changeset
219 asm(" .double sigentry");
Dave Love <fx@gnu.org>
parents:
diff changeset
220 asm(" .double 0");
Dave Love <fx@gnu.org>
parents:
diff changeset
221 asm(" .double 0");
Dave Love <fx@gnu.org>
parents:
diff changeset
222
Dave Love <fx@gnu.org>
parents:
diff changeset
223 asm(" .comm p_glbl,1");
Dave Love <fx@gnu.org>
parents:
diff changeset
224 }
Dave Love <fx@gnu.org>
parents:
diff changeset
225 #endif /* UMAX */
Dave Love <fx@gnu.org>
parents:
diff changeset
226
Dave Love <fx@gnu.org>
parents:
diff changeset
227 #ifdef CRT0_DUMMIES
Dave Love <fx@gnu.org>
parents:
diff changeset
228
Dave Love <fx@gnu.org>
parents:
diff changeset
229 /* Define symbol "start": here; some systems want that symbol. */
Dave Love <fx@gnu.org>
parents:
diff changeset
230 #ifdef DOT_GLOBAL_START
Dave Love <fx@gnu.org>
parents:
diff changeset
231 asm(" .text ");
Dave Love <fx@gnu.org>
parents:
diff changeset
232 asm(" .globl start ");
Dave Love <fx@gnu.org>
parents:
diff changeset
233 asm(" start: ");
Dave Love <fx@gnu.org>
parents:
diff changeset
234 #endif /* DOT_GLOBAL_START */
Dave Love <fx@gnu.org>
parents:
diff changeset
235
Dave Love <fx@gnu.org>
parents:
diff changeset
236 #ifdef NODOT_GLOBAL_START
Dave Love <fx@gnu.org>
parents:
diff changeset
237 asm(" text ");
Dave Love <fx@gnu.org>
parents:
diff changeset
238 asm(" global start ");
Dave Love <fx@gnu.org>
parents:
diff changeset
239 asm(" start: ");
Dave Love <fx@gnu.org>
parents:
diff changeset
240 #endif /* NODOT_GLOBAL_START */
Dave Love <fx@gnu.org>
parents:
diff changeset
241
Dave Love <fx@gnu.org>
parents:
diff changeset
242 #ifdef m68000
Dave Love <fx@gnu.org>
parents:
diff changeset
243
Dave Love <fx@gnu.org>
parents:
diff changeset
244 /* GCC 2.1, when optimization is turned off, seems to want to push a
Dave Love <fx@gnu.org>
parents:
diff changeset
245 word of garbage on the stack, which screws up the CRT0_DUMMIES
Dave Love <fx@gnu.org>
parents:
diff changeset
246 hack. So we hand-code _start in assembly language. */
Dave Love <fx@gnu.org>
parents:
diff changeset
247 asm(".text ");
Dave Love <fx@gnu.org>
parents:
diff changeset
248 asm(" .even ");
Dave Love <fx@gnu.org>
parents:
diff changeset
249 asm(".globl __start ");
Dave Love <fx@gnu.org>
parents:
diff changeset
250 asm("__start: ");
Dave Love <fx@gnu.org>
parents:
diff changeset
251 asm(" link a6,#0 ");
Dave Love <fx@gnu.org>
parents:
diff changeset
252 asm(" jbsr _start1 ");
Dave Love <fx@gnu.org>
parents:
diff changeset
253 asm(" unlk a6 ");
Dave Love <fx@gnu.org>
parents:
diff changeset
254 asm(" rts ");
Dave Love <fx@gnu.org>
parents:
diff changeset
255
Dave Love <fx@gnu.org>
parents:
diff changeset
256 #else /* not m68000 */
Dave Love <fx@gnu.org>
parents:
diff changeset
257
Dave Love <fx@gnu.org>
parents:
diff changeset
258 _start ()
Dave Love <fx@gnu.org>
parents:
diff changeset
259 {
Dave Love <fx@gnu.org>
parents:
diff changeset
260 /* On vax, nothing is pushed here */
Dave Love <fx@gnu.org>
parents:
diff changeset
261 /* On sequent, bogus fp is pushed here */
Dave Love <fx@gnu.org>
parents:
diff changeset
262 start1 ();
Dave Love <fx@gnu.org>
parents:
diff changeset
263 }
Dave Love <fx@gnu.org>
parents:
diff changeset
264
Dave Love <fx@gnu.org>
parents:
diff changeset
265 #endif /* possibly m68000 */
Dave Love <fx@gnu.org>
parents:
diff changeset
266
Dave Love <fx@gnu.org>
parents:
diff changeset
267 static
Dave Love <fx@gnu.org>
parents:
diff changeset
268 start1 (CRT0_DUMMIES argc, xargv)
Dave Love <fx@gnu.org>
parents:
diff changeset
269 int argc;
Dave Love <fx@gnu.org>
parents:
diff changeset
270 char *xargv;
Dave Love <fx@gnu.org>
parents:
diff changeset
271 {
Dave Love <fx@gnu.org>
parents:
diff changeset
272 register char **argv = &xargv;
Dave Love <fx@gnu.org>
parents:
diff changeset
273 environ = argv + argc + 1;
Dave Love <fx@gnu.org>
parents:
diff changeset
274
Dave Love <fx@gnu.org>
parents:
diff changeset
275 if ((char *)environ == xargv)
Dave Love <fx@gnu.org>
parents:
diff changeset
276 environ--;
Dave Love <fx@gnu.org>
parents:
diff changeset
277 exit (main (argc, argv, environ));
Dave Love <fx@gnu.org>
parents:
diff changeset
278
Dave Love <fx@gnu.org>
parents:
diff changeset
279 /* Refer to `start1' so GCC will not think it is never called
Dave Love <fx@gnu.org>
parents:
diff changeset
280 and optimize it out. */
Dave Love <fx@gnu.org>
parents:
diff changeset
281 (void) &start1;
Dave Love <fx@gnu.org>
parents:
diff changeset
282 }
Dave Love <fx@gnu.org>
parents:
diff changeset
283 #else /* not CRT0_DUMMIES */
Dave Love <fx@gnu.org>
parents:
diff changeset
284
Dave Love <fx@gnu.org>
parents:
diff changeset
285 /* "m68k" and "m68000" both stand for m68000 processors,
Dave Love <fx@gnu.org>
parents:
diff changeset
286 but with different program-entry conventions.
Dave Love <fx@gnu.org>
parents:
diff changeset
287 This is a kludge. Now that the CRT0_DUMMIES mechanism above exists,
Dave Love <fx@gnu.org>
parents:
diff changeset
288 most of these machines could use the vax code above
Dave Love <fx@gnu.org>
parents:
diff changeset
289 with some suitable definition of CRT0_DUMMIES.
Dave Love <fx@gnu.org>
parents:
diff changeset
290 Then the symbol m68k could be flushed.
Dave Love <fx@gnu.org>
parents:
diff changeset
291 But I don't want to risk breaking these machines
Dave Love <fx@gnu.org>
parents:
diff changeset
292 in a version 17 patch release, so that change is being put off. */
Dave Love <fx@gnu.org>
parents:
diff changeset
293
Dave Love <fx@gnu.org>
parents:
diff changeset
294 #ifdef m68k /* Can't do it all from C */
Dave Love <fx@gnu.org>
parents:
diff changeset
295 asm (" global _start");
Dave Love <fx@gnu.org>
parents:
diff changeset
296 asm (" text");
Dave Love <fx@gnu.org>
parents:
diff changeset
297 asm ("_start:");
Dave Love <fx@gnu.org>
parents:
diff changeset
298 #ifndef NU
Dave Love <fx@gnu.org>
parents:
diff changeset
299 #ifdef STRIDE
Dave Love <fx@gnu.org>
parents:
diff changeset
300 asm (" comm havefpu%,2");
Dave Love <fx@gnu.org>
parents:
diff changeset
301 #else /* m68k, not STRIDE */
Dave Love <fx@gnu.org>
parents:
diff changeset
302 asm (" comm splimit%,4");
Dave Love <fx@gnu.org>
parents:
diff changeset
303 #endif /* STRIDE */
Dave Love <fx@gnu.org>
parents:
diff changeset
304 asm (" global exit");
Dave Love <fx@gnu.org>
parents:
diff changeset
305 asm (" text");
Dave Love <fx@gnu.org>
parents:
diff changeset
306 #ifdef STRIDE
Dave Love <fx@gnu.org>
parents:
diff changeset
307 asm (" trap &3");
Dave Love <fx@gnu.org>
parents:
diff changeset
308 asm (" mov.w %d0,havefpu%");
Dave Love <fx@gnu.org>
parents:
diff changeset
309 #else /* m68k, not STRIDE */
Dave Love <fx@gnu.org>
parents:
diff changeset
310 asm (" mov.l %d0,splimit%");
Dave Love <fx@gnu.org>
parents:
diff changeset
311 #endif /* STRIDE */
Dave Love <fx@gnu.org>
parents:
diff changeset
312 #endif /* not NU */
Dave Love <fx@gnu.org>
parents:
diff changeset
313 asm (" jsr start1");
Dave Love <fx@gnu.org>
parents:
diff changeset
314 asm (" mov.l %d0,(%sp)");
Dave Love <fx@gnu.org>
parents:
diff changeset
315 asm (" jsr exit");
Dave Love <fx@gnu.org>
parents:
diff changeset
316 asm (" mov.l &1,%d0"); /* d0 = 1 => exit */
Dave Love <fx@gnu.org>
parents:
diff changeset
317 asm (" trap &0");
Dave Love <fx@gnu.org>
parents:
diff changeset
318 #else /* m68000, not m68k */
Dave Love <fx@gnu.org>
parents:
diff changeset
319
Dave Love <fx@gnu.org>
parents:
diff changeset
320 #ifdef m68000
Dave Love <fx@gnu.org>
parents:
diff changeset
321
Dave Love <fx@gnu.org>
parents:
diff changeset
322 #ifdef ISI68K
Dave Love <fx@gnu.org>
parents:
diff changeset
323 /* Added by ESM Sun May 24 12:44:02 1987 to get new ISI library to work */
Dave Love <fx@gnu.org>
parents:
diff changeset
324 /* Edited by Ray Mon May 15 15:59:56 EST 1989 so we can compile with gcc */
Dave Love <fx@gnu.org>
parents:
diff changeset
325 #if defined(BSD4_3) && !defined(__GNUC__)
Dave Love <fx@gnu.org>
parents:
diff changeset
326 static foo () {
Dave Love <fx@gnu.org>
parents:
diff changeset
327 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
328 asm (" .globl is68020");
Dave Love <fx@gnu.org>
parents:
diff changeset
329 asm ("is68020:");
Dave Love <fx@gnu.org>
parents:
diff changeset
330 #ifndef BSD4_3
Dave Love <fx@gnu.org>
parents:
diff changeset
331 asm (" .long 0x00000000");
Dave Love <fx@gnu.org>
parents:
diff changeset
332 asm (" .long 0xffffffff");
Dave Love <fx@gnu.org>
parents:
diff changeset
333 /* End of stuff added by ESM */
Dave Love <fx@gnu.org>
parents:
diff changeset
334 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
335 asm (" .text");
Dave Love <fx@gnu.org>
parents:
diff changeset
336 asm (" .globl __start");
Dave Love <fx@gnu.org>
parents:
diff changeset
337 asm ("__start:");
Dave Love <fx@gnu.org>
parents:
diff changeset
338 asm (" .word 0");
Dave Love <fx@gnu.org>
parents:
diff changeset
339 asm (" link a6,#0");
Dave Love <fx@gnu.org>
parents:
diff changeset
340 asm (" jbsr _start1");
Dave Love <fx@gnu.org>
parents:
diff changeset
341 asm (" unlk a6");
Dave Love <fx@gnu.org>
parents:
diff changeset
342 asm (" rts");
Dave Love <fx@gnu.org>
parents:
diff changeset
343 #if defined(BSD4_3) && !defined(__GNUC__)
Dave Love <fx@gnu.org>
parents:
diff changeset
344 }
Dave Love <fx@gnu.org>
parents:
diff changeset
345 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
346 #else /* not ISI68K */
Dave Love <fx@gnu.org>
parents:
diff changeset
347
Dave Love <fx@gnu.org>
parents:
diff changeset
348 _start ()
Dave Love <fx@gnu.org>
parents:
diff changeset
349 {
Dave Love <fx@gnu.org>
parents:
diff changeset
350 #ifdef sun
Dave Love <fx@gnu.org>
parents:
diff changeset
351 finitfp_();
49600
23a1cea22d13 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 27727
diff changeset
352 #endif
25844
Dave Love <fx@gnu.org>
parents:
diff changeset
353 /* On 68000, _start pushes a6 onto stack */
Dave Love <fx@gnu.org>
parents:
diff changeset
354 start1 ();
Dave Love <fx@gnu.org>
parents:
diff changeset
355 }
Dave Love <fx@gnu.org>
parents:
diff changeset
356 #endif /* not ISI68k */
Dave Love <fx@gnu.org>
parents:
diff changeset
357 #endif /* m68000 */
Dave Love <fx@gnu.org>
parents:
diff changeset
358 #endif /* m68k */
Dave Love <fx@gnu.org>
parents:
diff changeset
359
Dave Love <fx@gnu.org>
parents:
diff changeset
360 #if defined(m68k) || defined(m68000)
Dave Love <fx@gnu.org>
parents:
diff changeset
361 /* ignore takes care of skipping the a6 value pushed in start. */
Dave Love <fx@gnu.org>
parents:
diff changeset
362 static
Dave Love <fx@gnu.org>
parents:
diff changeset
363 #if defined(m68k)
Dave Love <fx@gnu.org>
parents:
diff changeset
364 start1 (argc, xargv)
Dave Love <fx@gnu.org>
parents:
diff changeset
365 #else
Dave Love <fx@gnu.org>
parents:
diff changeset
366 start1 (ignore, argc, xargv)
Dave Love <fx@gnu.org>
parents:
diff changeset
367 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
368 int argc;
Dave Love <fx@gnu.org>
parents:
diff changeset
369 char *xargv;
Dave Love <fx@gnu.org>
parents:
diff changeset
370 {
Dave Love <fx@gnu.org>
parents:
diff changeset
371 register char **argv = &xargv;
Dave Love <fx@gnu.org>
parents:
diff changeset
372 environ = argv + argc + 1;
Dave Love <fx@gnu.org>
parents:
diff changeset
373
Dave Love <fx@gnu.org>
parents:
diff changeset
374 if ((char *)environ == xargv)
Dave Love <fx@gnu.org>
parents:
diff changeset
375 environ--;
Dave Love <fx@gnu.org>
parents:
diff changeset
376 #ifdef sun_68881
Dave Love <fx@gnu.org>
parents:
diff changeset
377 asm(" jsr f68881_used");
Dave Love <fx@gnu.org>
parents:
diff changeset
378 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
379 #ifdef sun_fpa
Dave Love <fx@gnu.org>
parents:
diff changeset
380 asm(" jsr ffpa_used");
Dave Love <fx@gnu.org>
parents:
diff changeset
381 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
382 #ifdef sun_soft
Dave Love <fx@gnu.org>
parents:
diff changeset
383 asm(" jsr start_float");
Dave Love <fx@gnu.org>
parents:
diff changeset
384 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
385 exit (main (argc, argv, environ));
Dave Love <fx@gnu.org>
parents:
diff changeset
386 }
Dave Love <fx@gnu.org>
parents:
diff changeset
387
Dave Love <fx@gnu.org>
parents:
diff changeset
388 #endif /* m68k or m68000 */
Dave Love <fx@gnu.org>
parents:
diff changeset
389
Dave Love <fx@gnu.org>
parents:
diff changeset
390 #endif /* not CRT0_DUMMIES */
Dave Love <fx@gnu.org>
parents:
diff changeset
391
Dave Love <fx@gnu.org>
parents:
diff changeset
392 #ifdef hp9000s300
Dave Love <fx@gnu.org>
parents:
diff changeset
393 int argc_value;
Dave Love <fx@gnu.org>
parents:
diff changeset
394 char **argv_value;
Dave Love <fx@gnu.org>
parents:
diff changeset
395 #ifdef OLD_HP_ASSEMBLER
Dave Love <fx@gnu.org>
parents:
diff changeset
396 asm(" text");
Dave Love <fx@gnu.org>
parents:
diff changeset
397 asm(" globl __start");
Dave Love <fx@gnu.org>
parents:
diff changeset
398 asm(" globl _exit");
Dave Love <fx@gnu.org>
parents:
diff changeset
399 asm(" globl _main");
Dave Love <fx@gnu.org>
parents:
diff changeset
400 asm("__start");
Dave Love <fx@gnu.org>
parents:
diff changeset
401 asm(" dc.l 0");
Dave Love <fx@gnu.org>
parents:
diff changeset
402 asm(" subq.w #0x1,d0");
Dave Love <fx@gnu.org>
parents:
diff changeset
403 asm(" move.w d0,float_soft");
Dave Love <fx@gnu.org>
parents:
diff changeset
404 asm(" move.l 0x4(a7),d0");
Dave Love <fx@gnu.org>
parents:
diff changeset
405 asm(" beq.s skip_1");
Dave Love <fx@gnu.org>
parents:
diff changeset
406 asm(" move.l d0,a0");
Dave Love <fx@gnu.org>
parents:
diff changeset
407 asm(" clr.l -0x4(a0)");
Dave Love <fx@gnu.org>
parents:
diff changeset
408 asm("skip_1");
Dave Love <fx@gnu.org>
parents:
diff changeset
409 asm(" move.l a7,a0");
Dave Love <fx@gnu.org>
parents:
diff changeset
410 asm(" subq.l #0x8,a7");
Dave Love <fx@gnu.org>
parents:
diff changeset
411 asm(" move.l (a0),(a7)");
Dave Love <fx@gnu.org>
parents:
diff changeset
412 asm(" move.l (a0),_argc_value");
Dave Love <fx@gnu.org>
parents:
diff changeset
413 asm(" addq.l #0x4,a0");
Dave Love <fx@gnu.org>
parents:
diff changeset
414 asm(" move.l a0,0x4(a7)");
Dave Love <fx@gnu.org>
parents:
diff changeset
415 asm(" move.l a0,_argv_value");
Dave Love <fx@gnu.org>
parents:
diff changeset
416 asm("incr_loop");
Dave Love <fx@gnu.org>
parents:
diff changeset
417 asm(" tst.l (a0)+");
Dave Love <fx@gnu.org>
parents:
diff changeset
418 asm(" bne.s incr_loop");
Dave Love <fx@gnu.org>
parents:
diff changeset
419 asm(" move.l 0x4(a7),a1");
Dave Love <fx@gnu.org>
parents:
diff changeset
420 asm(" cmp.l (a1),a0");
Dave Love <fx@gnu.org>
parents:
diff changeset
421 asm(" blt.s skip_2");
Dave Love <fx@gnu.org>
parents:
diff changeset
422 asm(" subq.l #0x4,a0");
Dave Love <fx@gnu.org>
parents:
diff changeset
423 asm("skip_2");
Dave Love <fx@gnu.org>
parents:
diff changeset
424 asm(" move.l a0,0x8(a7)");
Dave Love <fx@gnu.org>
parents:
diff changeset
425 asm(" move.l a0,_environ");
Dave Love <fx@gnu.org>
parents:
diff changeset
426 asm(" jsr _main");
Dave Love <fx@gnu.org>
parents:
diff changeset
427 asm(" addq.l #0x8,a7");
Dave Love <fx@gnu.org>
parents:
diff changeset
428 asm(" move.l d0,-(a7)");
Dave Love <fx@gnu.org>
parents:
diff changeset
429 asm(" jsr _exit");
Dave Love <fx@gnu.org>
parents:
diff changeset
430 asm(" move.w #0x1,d0");
Dave Love <fx@gnu.org>
parents:
diff changeset
431 asm(" trap #0x0");
Dave Love <fx@gnu.org>
parents:
diff changeset
432 asm(" comm float_soft,4");
Dave Love <fx@gnu.org>
parents:
diff changeset
433 /* float_soft is allocated in this way because C would
Dave Love <fx@gnu.org>
parents:
diff changeset
434 put an underscore character in its name otherwise. */
Dave Love <fx@gnu.org>
parents:
diff changeset
435
Dave Love <fx@gnu.org>
parents:
diff changeset
436 #else /* new hp assembler */
Dave Love <fx@gnu.org>
parents:
diff changeset
437
Dave Love <fx@gnu.org>
parents:
diff changeset
438 asm(" text");
Dave Love <fx@gnu.org>
parents:
diff changeset
439 asm(" global float_loc");
Dave Love <fx@gnu.org>
parents:
diff changeset
440 asm(" set float_loc,0xFFFFB000");
Dave Love <fx@gnu.org>
parents:
diff changeset
441 asm(" global fpa_loc");
Dave Love <fx@gnu.org>
parents:
diff changeset
442 asm(" set fpa_loc,0xfff08000");
Dave Love <fx@gnu.org>
parents:
diff changeset
443 asm(" global __start");
Dave Love <fx@gnu.org>
parents:
diff changeset
444 asm(" global _exit");
Dave Love <fx@gnu.org>
parents:
diff changeset
445 asm(" global _main");
Dave Love <fx@gnu.org>
parents:
diff changeset
446 asm("__start:");
Dave Love <fx@gnu.org>
parents:
diff changeset
447 asm(" byte 0,0,0,0");
Dave Love <fx@gnu.org>
parents:
diff changeset
448 asm(" subq.w &1,%d0");
Dave Love <fx@gnu.org>
parents:
diff changeset
449 asm(" mov.w %d0,float_soft");
Dave Love <fx@gnu.org>
parents:
diff changeset
450 asm(" mov.w %d1,flag_68881");
Dave Love <fx@gnu.org>
parents:
diff changeset
451 #ifndef HPUX_68010
Dave Love <fx@gnu.org>
parents:
diff changeset
452 asm(" beq.b skip_float");
Dave Love <fx@gnu.org>
parents:
diff changeset
453 asm(" fmov.l &0x7400,%fpcr");
Dave Love <fx@gnu.org>
parents:
diff changeset
454 /* asm(" fmov.l &0x7480,%fpcr"); */
Dave Love <fx@gnu.org>
parents:
diff changeset
455 #endif /* HPUX_68010 */
Dave Love <fx@gnu.org>
parents:
diff changeset
456 asm("skip_float:");
Dave Love <fx@gnu.org>
parents:
diff changeset
457 asm(" mov.l %a0,%d0");
Dave Love <fx@gnu.org>
parents:
diff changeset
458 asm(" add.l %d0,%d0");
Dave Love <fx@gnu.org>
parents:
diff changeset
459 asm(" subx.w %d1,%d1");
Dave Love <fx@gnu.org>
parents:
diff changeset
460 asm(" mov.w %d1,flag_68010");
Dave Love <fx@gnu.org>
parents:
diff changeset
461 asm(" add.l %d0,%d0");
Dave Love <fx@gnu.org>
parents:
diff changeset
462 asm(" subx.w %d1,%d1");
Dave Love <fx@gnu.org>
parents:
diff changeset
463 asm(" mov.w %d1,flag_fpa");
Dave Love <fx@gnu.org>
parents:
diff changeset
464 asm(" tst.l %d2");
Dave Love <fx@gnu.org>
parents:
diff changeset
465 asm(" ble.b skip_3");
Dave Love <fx@gnu.org>
parents:
diff changeset
466 asm(" lsl flag_68881");
Dave Love <fx@gnu.org>
parents:
diff changeset
467 asm(" lsl flag_fpa");
Dave Love <fx@gnu.org>
parents:
diff changeset
468 asm("skip_3:");
Dave Love <fx@gnu.org>
parents:
diff changeset
469 asm(" mov.l 4(%a7),%d0");
Dave Love <fx@gnu.org>
parents:
diff changeset
470 asm(" beq.b skip_1");
Dave Love <fx@gnu.org>
parents:
diff changeset
471 asm(" mov.l %d0,%a0");
Dave Love <fx@gnu.org>
parents:
diff changeset
472 asm(" clr.l -4(%a0)");
Dave Love <fx@gnu.org>
parents:
diff changeset
473 asm("skip_1:");
Dave Love <fx@gnu.org>
parents:
diff changeset
474 asm(" mov.l %a7,%a0");
Dave Love <fx@gnu.org>
parents:
diff changeset
475 asm(" subq.l &8,%a7");
Dave Love <fx@gnu.org>
parents:
diff changeset
476 asm(" mov.l (%a0),(%a7)");
Dave Love <fx@gnu.org>
parents:
diff changeset
477 asm(" mov.l (%a0),_argc_value");
Dave Love <fx@gnu.org>
parents:
diff changeset
478 asm(" addq.l &4,%a0");
Dave Love <fx@gnu.org>
parents:
diff changeset
479 asm(" mov.l %a0,4(%a7)");
Dave Love <fx@gnu.org>
parents:
diff changeset
480 asm(" mov.l %a0,_argv_value");
Dave Love <fx@gnu.org>
parents:
diff changeset
481 asm("incr_loop:");
Dave Love <fx@gnu.org>
parents:
diff changeset
482 asm(" tst.l (%a0)+");
Dave Love <fx@gnu.org>
parents:
diff changeset
483 asm(" bne.b incr_loop");
Dave Love <fx@gnu.org>
parents:
diff changeset
484 asm(" mov.l 4(%a7),%a1");
Dave Love <fx@gnu.org>
parents:
diff changeset
485 asm(" cmp.l %a0,(%a1)");
Dave Love <fx@gnu.org>
parents:
diff changeset
486 asm(" blt.b skip_2");
Dave Love <fx@gnu.org>
parents:
diff changeset
487 asm(" subq.l &4,%a0");
Dave Love <fx@gnu.org>
parents:
diff changeset
488 asm("skip_2:");
Dave Love <fx@gnu.org>
parents:
diff changeset
489 asm(" mov.l %a0,8(%a7)");
Dave Love <fx@gnu.org>
parents:
diff changeset
490 asm(" mov.l %a0,_environ");
Dave Love <fx@gnu.org>
parents:
diff changeset
491 asm(" jsr _main");
Dave Love <fx@gnu.org>
parents:
diff changeset
492 asm(" addq.l &8,%a7");
Dave Love <fx@gnu.org>
parents:
diff changeset
493 asm(" mov.l %d0,-(%a7)");
Dave Love <fx@gnu.org>
parents:
diff changeset
494 asm(" jsr _exit");
Dave Love <fx@gnu.org>
parents:
diff changeset
495 asm(" mov.w &1,%d0");
Dave Love <fx@gnu.org>
parents:
diff changeset
496 asm(" trap &0");
Dave Love <fx@gnu.org>
parents:
diff changeset
497 asm(" comm float_soft, 4");
Dave Love <fx@gnu.org>
parents:
diff changeset
498 asm(" comm flag_68881, 4");
Dave Love <fx@gnu.org>
parents:
diff changeset
499 asm(" comm flag_68010, 4");
Dave Love <fx@gnu.org>
parents:
diff changeset
500 asm(" comm flag_68040, 4");
Dave Love <fx@gnu.org>
parents:
diff changeset
501 asm(" comm flag_fpa, 4");
Dave Love <fx@gnu.org>
parents:
diff changeset
502
Dave Love <fx@gnu.org>
parents:
diff changeset
503 #endif /* new hp assembler */
Dave Love <fx@gnu.org>
parents:
diff changeset
504 #endif /* hp9000s300 */
Dave Love <fx@gnu.org>
parents:
diff changeset
505
Dave Love <fx@gnu.org>
parents:
diff changeset
506 #ifdef GOULD
Dave Love <fx@gnu.org>
parents:
diff changeset
507
Dave Love <fx@gnu.org>
parents:
diff changeset
508 /* startup code has to be in near text rather
Dave Love <fx@gnu.org>
parents:
diff changeset
509 than fartext as allocated by the C compiler. */
Dave Love <fx@gnu.org>
parents:
diff changeset
510 asm(" .text");
Dave Love <fx@gnu.org>
parents:
diff changeset
511 asm(" .align 2");
Dave Love <fx@gnu.org>
parents:
diff changeset
512 asm(" .globl __start");
Dave Love <fx@gnu.org>
parents:
diff changeset
513 asm(" .text");
Dave Love <fx@gnu.org>
parents:
diff changeset
514 asm("__start:");
Dave Love <fx@gnu.org>
parents:
diff changeset
515 /* setup base register b1 (function base). */
Dave Love <fx@gnu.org>
parents:
diff changeset
516 asm(" .using b1,.");
Dave Love <fx@gnu.org>
parents:
diff changeset
517 asm(" tpcbr b1");
Dave Love <fx@gnu.org>
parents:
diff changeset
518 /* setup base registers b3 through b7 (data references). */
Dave Love <fx@gnu.org>
parents:
diff changeset
519 asm(" file basevals,b3");
Dave Love <fx@gnu.org>
parents:
diff changeset
520 /* setup base register b2 (stack pointer); it should be
Dave Love <fx@gnu.org>
parents:
diff changeset
521 aligned on a 8-word boundary; but because it is pointing
Dave Love <fx@gnu.org>
parents:
diff changeset
522 to argc, its value should be remembered (in r5). */
Dave Love <fx@gnu.org>
parents:
diff changeset
523 asm(" movw b2,r4");
Dave Love <fx@gnu.org>
parents:
diff changeset
524 asm(" movw b2,r5");
Dave Love <fx@gnu.org>
parents:
diff changeset
525 asm(" andw #~0x1f,r4");
Dave Love <fx@gnu.org>
parents:
diff changeset
526 asm(" movw r4,b2");
Dave Love <fx@gnu.org>
parents:
diff changeset
527 /* allocate stack frame to do some work. */
Dave Love <fx@gnu.org>
parents:
diff changeset
528 asm(" subea 16w,b2");
Dave Love <fx@gnu.org>
parents:
diff changeset
529 /* initialize signal catching for UTX/32 1.2; this is
Dave Love <fx@gnu.org>
parents:
diff changeset
530 necessary to make restart from saved image work. */
Dave Love <fx@gnu.org>
parents:
diff changeset
531 asm(" movea sigcatch,r1");
Dave Love <fx@gnu.org>
parents:
diff changeset
532 asm(" movw r1,8w[b2]");
Dave Love <fx@gnu.org>
parents:
diff changeset
533 asm(" svc #1,#150");
Dave Love <fx@gnu.org>
parents:
diff changeset
534 /* setup address of argc for start1. */
Dave Love <fx@gnu.org>
parents:
diff changeset
535 asm(" movw r5,8w[b2]");
Dave Love <fx@gnu.org>
parents:
diff changeset
536 asm(" func #1,_start1");
Dave Love <fx@gnu.org>
parents:
diff changeset
537 asm(" halt");
Dave Love <fx@gnu.org>
parents:
diff changeset
538 /* space for ld to store base register initial values. */
Dave Love <fx@gnu.org>
parents:
diff changeset
539 asm(" .align 5");
Dave Love <fx@gnu.org>
parents:
diff changeset
540 asm("basevals:");
Dave Love <fx@gnu.org>
parents:
diff changeset
541 asm(" .word __base3,__base4,__base5,__base6,__base7");
Dave Love <fx@gnu.org>
parents:
diff changeset
542
Dave Love <fx@gnu.org>
parents:
diff changeset
543 static
Dave Love <fx@gnu.org>
parents:
diff changeset
544 start1 (xargc)
Dave Love <fx@gnu.org>
parents:
diff changeset
545 int *xargc;
Dave Love <fx@gnu.org>
parents:
diff changeset
546 {
Dave Love <fx@gnu.org>
parents:
diff changeset
547 register int argc;
Dave Love <fx@gnu.org>
parents:
diff changeset
548 register char **argv;
Dave Love <fx@gnu.org>
parents:
diff changeset
549
Dave Love <fx@gnu.org>
parents:
diff changeset
550 argc = *xargc;
Dave Love <fx@gnu.org>
parents:
diff changeset
551 argv = (char **)(xargc) + 1;
Dave Love <fx@gnu.org>
parents:
diff changeset
552 environ = argv + argc + 1;
Dave Love <fx@gnu.org>
parents:
diff changeset
553
Dave Love <fx@gnu.org>
parents:
diff changeset
554 if (environ == argv)
Dave Love <fx@gnu.org>
parents:
diff changeset
555 environ--;
Dave Love <fx@gnu.org>
parents:
diff changeset
556 exit (main (argc, argv, environ));
Dave Love <fx@gnu.org>
parents:
diff changeset
557
Dave Love <fx@gnu.org>
parents:
diff changeset
558 }
Dave Love <fx@gnu.org>
parents:
diff changeset
559
Dave Love <fx@gnu.org>
parents:
diff changeset
560 #endif /* GOULD */
Dave Love <fx@gnu.org>
parents:
diff changeset
561
Dave Love <fx@gnu.org>
parents:
diff changeset
562 #ifdef elxsi
Dave Love <fx@gnu.org>
parents:
diff changeset
563 #include <elxsi/argvcache.h>
Dave Love <fx@gnu.org>
parents:
diff changeset
564
Dave Love <fx@gnu.org>
parents:
diff changeset
565 extern char **environ;
Dave Love <fx@gnu.org>
parents:
diff changeset
566 extern int errno;
Dave Love <fx@gnu.org>
parents:
diff changeset
567 extern void _init_doscan(), _init_iob();
Dave Love <fx@gnu.org>
parents:
diff changeset
568 extern char end[];
Dave Love <fx@gnu.org>
parents:
diff changeset
569 char *_init_brk = end;
Dave Love <fx@gnu.org>
parents:
diff changeset
570
Dave Love <fx@gnu.org>
parents:
diff changeset
571 _start()
Dave Love <fx@gnu.org>
parents:
diff changeset
572 {
Dave Love <fx@gnu.org>
parents:
diff changeset
573 environ = exec_cache.ac_envp;
Dave Love <fx@gnu.org>
parents:
diff changeset
574 brk (_init_brk);
Dave Love <fx@gnu.org>
parents:
diff changeset
575 errno = 0;
Dave Love <fx@gnu.org>
parents:
diff changeset
576 _init_doscan ();
Dave Love <fx@gnu.org>
parents:
diff changeset
577 _init_iob ();
Dave Love <fx@gnu.org>
parents:
diff changeset
578 _exit (exit (main (exec_cache.ac_argc,
Dave Love <fx@gnu.org>
parents:
diff changeset
579 exec_cache.ac_argv,
Dave Love <fx@gnu.org>
parents:
diff changeset
580 exec_cache.ac_envp)));
Dave Love <fx@gnu.org>
parents:
diff changeset
581 }
Dave Love <fx@gnu.org>
parents:
diff changeset
582 #endif /* elxsi */
Dave Love <fx@gnu.org>
parents:
diff changeset
583
Dave Love <fx@gnu.org>
parents:
diff changeset
584
Dave Love <fx@gnu.org>
parents:
diff changeset
585 #ifdef sparc
Dave Love <fx@gnu.org>
parents:
diff changeset
586 asm (".global __start");
Dave Love <fx@gnu.org>
parents:
diff changeset
587 asm (".text");
Dave Love <fx@gnu.org>
parents:
diff changeset
588 asm ("__start:");
Dave Love <fx@gnu.org>
parents:
diff changeset
589 asm (" mov 0, %fp");
Dave Love <fx@gnu.org>
parents:
diff changeset
590 asm (" ld [%sp + 64], %o0");
Dave Love <fx@gnu.org>
parents:
diff changeset
591 asm (" add %sp, 68, %o1");
Dave Love <fx@gnu.org>
parents:
diff changeset
592 asm (" sll %o0, 2, %o2");
Dave Love <fx@gnu.org>
parents:
diff changeset
593 asm (" add %o2, 4, %o2");
Dave Love <fx@gnu.org>
parents:
diff changeset
594 asm (" add %o1, %o2, %o2");
Dave Love <fx@gnu.org>
parents:
diff changeset
595 asm (" sethi %hi(_environ), %o3");
Dave Love <fx@gnu.org>
parents:
diff changeset
596 asm (" st %o2, [%o3+%lo(_environ)]");
Dave Love <fx@gnu.org>
parents:
diff changeset
597 asm (" andn %sp, 7, %sp");
Dave Love <fx@gnu.org>
parents:
diff changeset
598 asm (" call _main");
Dave Love <fx@gnu.org>
parents:
diff changeset
599 asm (" sub %sp, 24, %sp");
Dave Love <fx@gnu.org>
parents:
diff changeset
600 asm (" call __exit");
Dave Love <fx@gnu.org>
parents:
diff changeset
601 asm (" nop");
Dave Love <fx@gnu.org>
parents:
diff changeset
602
Dave Love <fx@gnu.org>
parents:
diff changeset
603 #endif /* sparc */
Dave Love <fx@gnu.org>
parents:
diff changeset
604
Dave Love <fx@gnu.org>
parents:
diff changeset
605 #if __FreeBSD__ == 2
Dave Love <fx@gnu.org>
parents:
diff changeset
606 char *__progname;
Dave Love <fx@gnu.org>
parents:
diff changeset
607 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
608 #ifdef __bsdi__
Dave Love <fx@gnu.org>
parents:
diff changeset
609 #include <sys/param.h> /* for version number */
Dave Love <fx@gnu.org>
parents:
diff changeset
610 #if defined(_BSDI_VERSION) && (_BSDI_VERSION >= 199501)
Dave Love <fx@gnu.org>
parents:
diff changeset
611 char *__progname;
Dave Love <fx@gnu.org>
parents:
diff changeset
612 #endif
Dave Love <fx@gnu.org>
parents:
diff changeset
613 #endif /* __bsdi__ */
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
614
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
615 /* arch-tag: 4025c2fb-d6b1-4d29-b1b6-8100b6bd1e74
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49600
diff changeset
616 (do not change this comment) */