1 /*-
2 * Copyright (c) 1990, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 */
7
8 #ifndef lint
9 static char sccsid[] = "@(#)crt0.c 8.1 (Berkeley) 06/01/93";
10 #endif /* not lint */
11
12 /*
13 * C start up routine.
14 * Robert Henry, UCB, 20 Oct 81
15 *
16 * We make the following (true) assumption:
17 * 1) The only register variable that we can trust is ebp,
18 * which points to the base of the kernel calling frame.
19 */
20
21 #include <stddef.h>
22 #include <stdlib.h>
23 #include <string.h>
24
25 char **environ = (char **)0;
26 static char empty[1];
27 char *__progname = empty;
28 static int fd;
29
30 asm(".text");
31 asm(".long 0xc000c000");
32
33 extern unsigned char etext;
34 extern unsigned char eprol asm ("eprol");
35 extern start() asm("start");
36
start()37 start()
38 {
39 struct kframe {
40 int kargc;
41 char *kargv[1]; /* size depends on kargc */
42 char kargstr[1]; /* size varies */
43 char kenvstr[1]; /* size varies */
44 };
45 /*
46 * ALL REGISTER VARIABLES!!!
47 */
48 register struct kframe *kfp; /* r10 */
49 register char **targv;
50 register char **argv;
51 extern int errno;
52 extern void _mcleanup();
53
54 #ifdef lint
55 kfp = 0;
56 initcode = initcode = 0;
57 #else
58 asm("lea 4(%ebp),%ebx"); /* catch it quick */
59 #endif
60 for (argv = targv = &kfp->kargv[0]; *targv++; /* void */)
61 /* void */ ;
62 if (targv >= (char **)(*argv))
63 --targv;
64 environ = targv;
65 asm("eprol:");
66
67 #ifdef paranoid
68 /*
69 * The standard I/O library assumes that file descriptors 0, 1, and 2
70 * are open. If one of these descriptors is closed prior to the start
71 * of the process, I/O gets very confused. To avoid this problem, we
72 * insure that the first three file descriptors are open before calling
73 * main(). Normally this is undefined, as it adds two unnecessary
74 * system calls.
75 */
76 do {
77 fd = open("/dev/null", 2);
78 } while (fd >= 0 && fd < 3);
79 close(fd);
80 #endif
81
82 #ifdef MCRT0
83 atexit(_mcleanup);
84 monstartup(&eprol, &etext);
85 #endif
86 errno = 0;
87 if (argv[0])
88 if ((__progname = strrchr(argv[0], '/')) == NULL)
89 __progname = argv[0];
90 else
91 ++__progname;
92 exit(main(kfp->kargc, argv, environ));
93 }
94
95 #ifdef CRT0
96 /*
97 * null moncontrol just in case some routine is compiled for profiling
98 */
moncontrol(val)99 moncontrol(val)
100 int val;
101 {
102
103 }
104 #endif
105