|
|
1.1 root 1: /* C code startup routine.
2: Copyright (C) 1985 Richard M. Stallman
3:
4: This program is distributed in the hope that it will be useful,
5: but without any warranty. No author or distributor
6: accepts responsibility to anyone for the consequences of using it
7: or for whether it serves any particular purpose or works at all,
8: unless he says so in writing.
9:
10: Permission is granted to anyone to distribute verbatim copies
11: of this program's source code as received, in any medium, provided that
12: the copyright notice, the nonwarraty notice above
13: and this permission notice are preserved,
14: and that the distributor grants the recipient all rights
15: for further redistribution as permitted by this notice,
16: and informs him of these rights.
17:
18: Permission is granted to distribute modified versions of this
19: program's source code, or of portions of it, under the above
20: conditions, plus the conditions that all changed files carry
21: prominent notices stating who last changed them and that the
22: derived material, including anything packaged together with it and
23: conceptually functioning as a modification of it rather than an
24: application of it, is in its entirety subject to a permission
25: notice identical to this one.
26:
27: Permission is granted to distribute this program (verbatim or
28: as modified) in compiled or executable form, provided verbatim
29: redistribution is permitted as stated above for source code, and
30: A. it is accompanied by the corresponding machine-readable
31: source code, under the above conditions, or
32: B. it is accompanied by a written offer, with no time limit,
33: to distribute the corresponding machine-readable source code,
34: under the above conditions, to any one, in return for reimbursement
35: of the cost of distribution. Verbatim redistribution of the
36: written offer must be permitted. Or,
37: C. it is distributed by someone who received only the
38: compiled or executable form, and is accompanied by a copy of the
39: written offer of source code which he received along with it.
40:
41: Permission is granted to distribute this program (verbatim or as modified)
42: in executable form as part of a larger system provided that the source
43: code for this program, including any modifications used,
44: is also distributed or offered as stated in the preceding paragraph.
45:
46: In other words, you are welcome to use, share and improve this program.
47: You are forbidden to forbid anyone else to use, share and improve
48: what you give them. Help stamp out software-hoarding! */
49:
50:
51: /* The standard Vax 4.2 Unix crt0.c cannot be used for Emacs
52: because it makes `envron' an initialized variable.
53: It is easiest to have a special crt0.c on all machines
54: though I don't know whether other machines actually need it. */
55:
56: /* On the vax and 68000, in BSD4.2 and USG5.2,
57: this is the data format on startup:
58: (vax) ap and fp are unpredictable as far as I know; don't use them.
59: sp -> word containing argc
60: word pointing to first arg string
61: [word pointing to next arg string]... 0 or more times
62: 0
63: Optionally:
64: [word pointing to environment variable]... 1 or more times
65: ...
66: 0
67: And always:
68: first arg string
69: [next arg string]... 0 or more times
70: */
71:
72: /* On the 16000, at least in the one 4.2 system I know about,
73: the initial data format is
74: sp -> word containing argc
75: word containing argp
76: word pointing to first arg string, and so on as above
77: */
78:
79: #include "config.h"
80:
81: /* ******** WARNING ********
82: Do not insert any data definitions before data_start!
83: Since this is the first file linked, the address of the following
84: variable should correspond to the start of initialized data space.
85: On some systems this is a constant that is independent of the text
86: size for shared executables. On others, it is a function of the
87: text size. In short, this seems to be the most portable way to
88: discover the start of initialized data space dynamically at runtime,
89: for either shared or unshared executables, on either swapping or
90: virtual systems. It only requires that the linker allocate objects
91: in the order encountered, a reasonable model for most Unix systems.
92: Similarly, note that the address of _start() should be the start
93: of text space. Fred Fish, UniSoft Systems Inc. */
94:
95: int data_start = 0;
96:
97: #ifdef NEED_ERRNO
98: int errno = 0;
99: #endif
100:
101: char **environ;
102:
103: #if defined(orion) || defined(pyramid) || defined (celerity)
104:
105: _start (argc, argv, envp)
106: int argc;
107: char **argv, **envp;
108: {
109: environ = envp;
110:
111: exit (main (argc, argv, envp));
112: }
113:
114: #endif /* orion or pyramid or celerity */
115:
116: #if defined (ns16000) && !defined (sequent) && !defined (UMAX)
117:
118: _start ()
119: {
120: /* On 16000, _start pushes fp onto stack */
121: start1 ();
122: }
123:
124: /* ignore takes care of skipping the fp value pushed in start. */
125: static
126: start1 (ignore, argc, argv)
127: int ignore;
128: int argc;
129: register char **argv;
130: {
131: environ = argv + argc + 1;
132:
133: if (environ == *argv)
134: environ--;
135: exit (main (argc, argv, environ));
136: }
137: #endif /* ns16000, not sequent and not UMAX */
138:
139: #ifdef UMAX
140: _start()
141: {
142: asm(" exit [] # undo enter");
143: asm(" .set exitsc,1");
144: asm(" .set sigcatchall,0x400");
145:
146: asm(" .globl _exit");
147: asm(" .globl start");
148: asm(" .globl __start");
149: asm(" .globl _main");
150: asm(" .globl _environ");
151: asm(" .globl _sigvec");
152: asm(" .globl sigentry");
153:
154: asm("start:");
155: asm(" br .xstart");
156: asm(" .org 0x20");
157: asm(" .double p_glbl,0,0xf00000,0");
158: asm(" .org 0x30");
159: asm(".xstart:");
160: asm(" adjspb $8");
161: asm(" movd 8(sp),0(sp) # argc");
162: asm(" addr 12(sp),r0");
163: asm(" movd r0,4(sp) # argv");
164: asm("L1:");
165: asm(" movd r0,r1");
166: asm(" addqd $4,r0");
167: asm(" cmpqd $0,0(r1) # null args term ?");
168: asm(" bne L1");
169: asm(" cmpd r0,0(4(sp)) # end of 'env' or 'argv' ?");
170: asm(" blt L2");
171: asm(" addqd $-4,r0 # envp's are in list");
172: asm("L2:");
173: asm(" movd r0,8(sp) # env");
174: asm(" movd r0,@_environ # indir is 0 if no env ; not 0 if env");
175: asm(" movqd $0,tos # setup intermediate signal handler");
176: asm(" addr @sv,tos");
177: asm(" movzwd $sigcatchall,tos");
178: asm(" jsr @_sigvec");
179: asm(" adjspb $-12");
180: asm(" jsr @_main");
181: asm(" adjspb $-12");
182: asm(" movd r0,tos");
183: asm(" jsr @_exit");
184: asm(" adjspb $-4");
185: asm(" addr @exitsc,r0");
186: asm(" svc");
187: asm(" .align 4 # sigvec arg");
188: asm("sv:");
189: asm(" .double sigentry");
190: asm(" .double 0");
191: asm(" .double 0");
192:
193: asm(" .comm p_glbl,1");
194: }
195: #endif /* UMAX */
196:
197: #if defined(vax) || defined(tahoe) || defined (sequent) || defined (BOGUS)
198:
199: #ifdef sequent
200: #define BOGUS bogus_fp,
201: #endif /* sequent */
202:
203: #ifdef vax
204: #define BOGUS
205: #endif /* vax */
206:
207: #ifdef tahoe
208: #define BOGUS
209: #endif /* tahoe */
210:
211: /* Define symbol "start": here; some systems want that symbol. */
212: #ifdef tower32
213: asm(" text ");
214: asm(" global start ");
215: #else
216: asm(" .text ");
217: asm(" .globl start ");
218: #endif
219: asm(" start: ");
220:
221: _start ()
222: {
223: /* On vax, nothing is pushed here */
224: /* On sequent, bogus fp is pushed here */
225: start1 ();
226: }
227:
228: static
229: start1 (BOGUS argc, xargv)
230: int argc;
231: char *xargv;
232: {
233: register char **argv = &xargv;
234: environ = argv + argc + 1;
235:
236: if ((char *)environ == xargv)
237: environ--;
238: exit (main (argc, argv, environ));
239: }
240: #else /* not vax or tahoe or sequent or BOGUS */
241:
242: /* "m68k" and "m68000" both stand for m68000 processors,
243: but with different program-entry conventions.
244: This is a kludge. Now that the BOGUS mechanism above exists,
245: most of these machines could use the vax code above
246: with some suitable definition of BOGUS.
247: Then the symbol m68k could be flushed.
248: But I don't want to risk breaking these machines
249: in a version 17 patch release, so that change is being put off. */
250:
251: #ifdef m68k /* Can't do it all from C */
252: #ifdef STRIDE
253: asm (" comm havefpu%,2");
254: #else /* m68k, not STRIDE */
255: asm (" data");
256: asm (" even");
257: asm (" global splimit%");
258: asm ("splimit%:");
259: asm (" space 4");
260: #endif /* STRIDE */
261: asm (" global _start");
262: asm (" global exit");
263: asm (" text");
264: asm ("_start:");
265: #ifdef STRIDE
266: asm (" trap &3");
267: asm (" mov.w %d0,havefpu%");
268: #else /* m68k, not STRIDE */
269: asm (" mov.l %d0,splimit%");
270: #endif /* STRIDE */
271: asm (" jsr start1");
272: asm (" mov.l %d0,(%sp)");
273: asm (" jsr exit");
274: asm (" mov.l &1,%d0"); /* d0 = 1 => exit */
275: asm (" trap &0");
276: #else /* m68000, not m68k */
277:
278: #ifdef m68000
279:
280: _start ()
281: {
282: /* On 68000, _start pushes a6 onto stack */
283: start1 ();
284: }
285: #endif /* m68000 */
286: #endif /* m68k */
287:
288: #if defined(m68k) || defined(m68000)
289: /* ignore takes care of skipping the a6 value pushed in start. */
290: static
291: #ifdef m68k
292: start1 (argc, xargv)
293: #else
294: start1 (ignore, argc, xargv)
295: #endif
296: int argc;
297: char *xargv;
298: {
299: register char **argv = &xargv;
300: environ = argv + argc + 1;
301:
302: if ((char *)environ == xargv)
303: environ--;
304: #ifdef sun2
305: hack_sky();
306: #endif /* sun2 */
307: exit (main (argc, argv, environ));
308: }
309:
310: #endif /* m68k or m68000 */
311:
312: #endif /* not vax or tahoe or sequent or BOGUS */
313:
314: #ifdef hp9000s200
315: int argc_value;
316: char **argv_value;
317:
318: asm(" text");
319: asm(" globl __start");
320: asm(" globl _exit");
321: asm(" globl _main");
322: asm("__start");
323: asm(" dc.l 0");
324: asm(" subq.w #0x1,d0");
325: asm(" move.w d0,float_soft");
326: asm(" move.l 0x4(a7),d0");
327: asm(" beq.s skip_1");
328: asm(" move.l d0,a0");
329: asm(" clr.l -0x4(a0)");
330: asm("skip_1");
331: asm(" move.l a7,a0");
332: asm(" subq.l #0x8,a7");
333: asm(" move.l (a0),(a7)");
334: asm(" move.l (a0),_argc_value");
335: asm(" addq.l #0x4,a0");
336: asm(" move.l a0,0x4(a7)");
337: asm(" move.l a0,_argv_value");
338: asm("incr_loop");
339: asm(" tst.l (a0)+");
340: asm(" bne.s incr_loop");
341: asm(" move.l 0x4(a7),a1");
342: asm(" cmp.l (a1),a0");
343: asm(" blt.s skip_2");
344: asm(" subq.l #0x4,a0");
345: asm("skip_2");
346: asm(" move.l a0,0x8(a7)");
347: asm(" move.l a0,_environ");
348: asm(" jsr _main");
349: asm(" addq.l #0x8,a7");
350: asm(" move.l d0,-(a7)");
351: asm(" jsr _exit");
352: asm(" move.w #0x1,d0");
353: asm(" trap #0x0");
354: asm(" comm float_soft,4");
355: /* float_soft is allocated in this way because C would
356: put an underscore character in its name otherwise. */
357: #endif /* hp9000s200 */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.