annotate src/ecrt0.c @ 53879:e3771c262410

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