annotate src/ecrt0.c @ 5781:0853e1ec8529

Use alloca_{rawbytes,ibytes} in #'copy-file, #'insert-file-contents-internal src/ChangeLog addition: 2014-01-20 Aidan Kehoe <kehoea@parhasard.net> * fileio.c (Fcopy_file, Finsert_file_contents_internal): Use alloca_{rawbytes,ibytes} here instead of the implicit alloca on the stack; doesn't change where the buffers are allocated for these two functions, but does mean that decisions about alloca vs. malloc based on buffer size are made in the same place (ultimately, the ALLOCA() macro).
author Aidan Kehoe <kehoea@parhasard.net>
date Mon, 20 Jan 2014 17:53:07 +0000
parents 308d34e9f07d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* C code startup routine.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 Copyright (C) 1985, 1986, 1992, 1993 Free Software Foundation, Inc.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4759
diff changeset
6 XEmacs is free software: you can redistribute it and/or modify it
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 under the terms of the GNU General Public License as published by the
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4759
diff changeset
8 Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4759
diff changeset
9 option) any later version.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 XEmacs is distributed in the hope that it will be useful, but WITHOUT
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 for more details.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 4759
diff changeset
17 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 /* Synched up with: FSF 19.30. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 428
diff changeset
22 /* [[The standard Vax 4.2 Unix crt0.c cannot be used for Emacs
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 because it makes `environ' an initialized variable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 It is easiest to have a special crt0.c on all machines
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 428
diff changeset
25 though I don't know whether other machines actually need it.]]
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 428
diff changeset
26 This is insane! We DO NOT want to be doing this crap. */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 /* On the vax and 68000, in BSD4.2 and USG5.2,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 this is the data format on startup:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 (vax) ap and fp are unpredictable as far as I know; don't use them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 sp -> word containing argc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 word pointing to first arg string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 [word pointing to next arg string]... 0 or more times
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 Optionally:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 [word pointing to environment variable]... 1 or more times
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 ...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 0
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 And always:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 first arg string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 [next arg string]... 0 or more times
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 /* On the 16000, at least in the one 4.2 system I know about,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 the initial data format is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 sp -> word containing argc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 word containing argp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 word pointing to first arg string, and so on as above
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 #ifdef emacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 #include <config.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 #ifdef __GNUC__
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 #define asm __asm
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 /* Workaround for Sun cc 3.0, which doesn't handle asm's outside a fn. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 #if __SUNPRO_C >= 0x300
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 #define no_toplevel_asm
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 /* ******** WARNING ********
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 Do not insert any data definitions before data_start!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 Since this is the first file linked, the address of the following
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 variable should correspond to the start of initialized data space.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 On some systems this is a constant that is independent of the text
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 size for shared executables. On others, it is a function of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 text size. In short, this seems to be the most portable way to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 discover the start of initialized data space dynamically at runtime,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72 for either shared or unshared executables, on either swapping or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 virtual systems. It only requires that the linker allocate objects
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 in the order encountered, a reasonable model for most Unix systems.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 Similarly, note that the address of _start() should be the start
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 of text space. Fred Fish, UniSoft Systems Inc. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 int data_start = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 #ifdef NEED_ERRNO
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 int errno;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 char **environ;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 #ifndef static
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 /* On systems where the static storage class is usable, this function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 should be declared as static. Otherwise, the static keyword has
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 been defined to be something else, and code for those systems must
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 take care of this declaration appropriately. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 static start1 ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 #ifdef CRT0_DUMMIES
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 /* Define symbol "start": here; some systems want that symbol. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 #ifdef DOT_GLOBAL_START
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 asm(" .text ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 asm(" .globl start ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 asm(" start: ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 #endif /* DOT_GLOBAL_START */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 #ifdef NODOT_GLOBAL_START
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 asm(" text ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 asm(" global start ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 asm(" start: ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 #endif /* NODOT_GLOBAL_START */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 #ifdef m68000
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 /* GCC 2.1, when optimization is turned off, seems to want to push a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 word of garbage on the stack, which screws up the CRT0_DUMMIES
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 hack. So we hand-code _start in assembly language. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 asm(".text ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 #ifndef sony_news
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 asm(" .even ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 #else /* sony_news (not gas) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 + asm(" .align 2 ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 #endif /* sony_news (not gas) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 asm(".globl __start ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 asm("__start: ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 asm(" link a6,#0 ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 asm(" jbsr _start1 ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 asm(" unlk a6 ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 asm(" rts ");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 #else /* not m68000 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 _start ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 start1 ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 #endif /* possibly m68000 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 #ifdef __bsdi__ /* for version number */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 #include <sys/param.h>
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 #if defined(_BSDI_VERSION) && (_BSDI_VERSION >= 199501)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 char *__progname;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 static int
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 start1 (CRT0_DUMMIES int argc, char *xargv)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 char **argv = &xargv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 environ = argv + argc + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 #if defined(_BSDI_VERSION) && (_BSDI_VERSION >= 199501)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 __progname = argv[0];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 if ((char *)environ == xargv)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 environ--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 exit (main (argc, argv, environ));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 /* Refer to `start1' so GCC will not think it is never called
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 and optimize it out. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 (void) &start1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 #else /* not CRT0_DUMMIES */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 /* "m68k" and "m68000" both stand for m68000 processors,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 but with different program-entry conventions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 This is a kludge. Now that the CRT0_DUMMIES mechanism above exists,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 most of these machines could use the vax code above
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 with some suitable definition of CRT0_DUMMIES.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 Then the symbol m68k could be flushed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 But I don't want to risk breaking these machines
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 in a version 17 patch release, so that change is being put off. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 #ifdef m68k /* Can't do it all from C */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 asm (" global _start");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 asm (" text");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 asm ("_start:");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 #ifndef NU
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 #ifdef STRIDE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 asm (" comm havefpu%,2");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 #else /* m68k, not STRIDE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 asm (" comm splimit%,4");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 #endif /* STRIDE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 asm (" global exit");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 asm (" text");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 #ifdef STRIDE
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 asm (" trap &3");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 asm (" mov.w %d0,havefpu%");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 #else /* m68k, not STRIDE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 asm (" mov.l %d0,splimit%");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 #endif /* STRIDE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 #endif /* not NU */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 asm (" jsr start1");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 asm (" mov.l %d0,(%sp)");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 asm (" jsr exit");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 asm (" mov.l &1,%d0"); /* d0 = 1 => exit */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 asm (" trap &0");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 #else /* m68000, not m68k */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 #ifdef m68000
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 _start ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 #ifdef sun
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 finitfp_();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 /* On 68000, _start pushes a6 onto stack */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 start1 ();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 #endif /* m68000 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 #endif /* m68k */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 #if defined(m68k) || defined(m68000)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 /* ignore takes care of skipping the a6 value pushed in start. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 static
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 #if defined(m68k)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 start1 (argc, xargv)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 start1 (ignore, argc, xargv)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 int argc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 char *xargv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 char **argv = &xargv;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 environ = argv + argc + 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 if ((char *)environ == xargv)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 environ--;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 #ifdef sun_68881
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 asm(" jsr f68881_used");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 #ifdef sun_fpa
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 asm(" jsr ffpa_used");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 #ifdef sun_soft
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 asm(" jsr start_float");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 exit (main (argc, argv, environ));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 #endif /* m68k or m68000 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 #endif /* not CRT0_DUMMIES */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 #ifdef sparc
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 #ifdef no_toplevel_asm
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 static no_toplevel_asm_wrapper() {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 #ifdef USG5_4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 asm (".pushsection \".text\"");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 #endif /* USG5_4 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 #endif /* no_toplevel_asm */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 #ifdef USG5_4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 asm (".global _start");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 asm (".text");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 asm ("_start:");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 asm (" mov 0, %fp");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 asm (" ld [%sp + 64], %o0");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 asm (" add %sp, 68, %o1");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 asm (" sll %o0, 2, %o2");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 asm (" add %o2, 4, %o2");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 asm (" add %o1, %o2, %o2");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 asm (" sethi %hi(_environ), %o3");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 asm (" st %o2, [%o3+%lo(_environ)]");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 asm (" andn %sp, 7, %sp");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 asm (" call main");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 asm (" sub %sp, 24, %sp");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 asm (" call _exit");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 asm (" nop");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 asm (".global __start");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 asm (".text");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 asm ("__start:");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 asm (" mov 0, %fp");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 asm (" ld [%sp + 64], %o0");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 asm (" add %sp, 68, %o1");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 asm (" sll %o0, 2, %o2");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 asm (" add %o2, 4, %o2");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 asm (" add %o1, %o2, %o2");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 asm (" sethi %hi(_environ), %o3");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 asm (" st %o2, [%o3+%lo(_environ)]");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 asm (" andn %sp, 7, %sp");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 asm (" call _main");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 asm (" sub %sp, 24, %sp");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 asm (" call __exit");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 asm (" nop");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 #endif /* USG5_4 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 #ifdef no_toplevel_asm
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 #ifdef USG5_4
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 asm (".popsection");
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 #endif /* USG5_4 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 } /* no_toplevel_asm_wrapper() */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 #endif /* no_toplevel_asm */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 #endif /* sparc */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 #if __FreeBSD__ == 2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 char *__progname;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 #ifdef __bsdi__
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 #include <sys/param.h> /* for version number */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 #if defined(_BSDI_VERSION) && (_BSDI_VERSION >= 199501)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 char *__progname;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 #endif /* __bsdi__ */