source: trunk/libs/newlib/src/newlib/libc/sys/sysvi386/crt0.c @ 444

Last change on this file since 444 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 3.8 KB
Line 
1/*-
2 * Copyright (c) 1990 The Regents of the University of California.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 *    must display the following acknowledgement:
15 *      This product includes software developed by the University of
16 *      California, Berkeley and its contributors.
17 * 4. Neither the name of the University nor the names of its contributors
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
34#if defined(LIBC_SCCS) && !defined(lint)
35static char sccsid[] = "@(#)crt0.c      5.7 (Berkeley) 7/3/91";
36#endif /* LIBC_SCCS and not lint */
37
38/*
39 *      C start up routine.
40 *      Robert Henry, UCB, 20 Oct 81
41 *
42 *      We make the following (true) assumption:
43 *      1) The only register variable that we can trust is ebp,
44 *      which points to the base of the kernel calling frame.
45 */
46
47char **environ = (char **)0;
48static int fd;
49
50/*
51asm(".text");
52asm(".long 0xc000c000");
53*/
54extern  unsigned char   etext;
55extern  unsigned char   eprol asm ("eprol");
56/* extern                       start() asm("start"); */
57
58_start(int arg)
59{
60        struct kframe {
61                int     kargc;
62                char    *kargv[1];      /* size depends on kargc */
63                char    kargstr[1];     /* size varies */
64                char    kenvstr[1];     /* size varies */
65        };
66        /*
67         *      ALL REGISTER VARIABLES!!!
68         */
69        register struct kframe *kfp;    /* r10 */
70        register char **targv;
71        register char **argv;
72        extern int errno;
73        extern void _mcleanup();
74
75#ifdef lint
76        kfp = 0;
77        initcode = initcode = 0;
78#else not lint
79# if 0
80        asm("lea 4(%ebp),%ebx");        /* catch it quick */
81# else
82        kfp = (struct kframe *)&(((int *)(&arg))[-1]);
83# endif
84#endif not lint
85        for (argv = targv = &kfp->kargv[0]; *targv++; /* void */)
86                /* void */ ;
87        if (targv >= (char **)(*argv))
88                --targv;
89        environ = targv;
90asm("eprol:");
91
92#ifdef paranoid
93        /*
94         * The standard I/O library assumes that file descriptors 0, 1, and 2
95         * are open. If one of these descriptors is closed prior to the start
96         * of the process, I/O gets very confused. To avoid this problem, we
97         * insure that the first three file descriptors are open before calling
98         * main(). Normally this is undefined, as it adds two unnecessary
99         * system calls.
100         */
101        do      {
102                fd = open("/dev/null", 2);
103        } while (fd >= 0 && fd < 3);
104        close(fd);
105#endif paranoid
106
107#ifdef MCRT0
108        atexit(_mcleanup);
109        monstartup(&eprol, &etext);
110#endif MCRT0
111        errno = 0;
112        exit(main(kfp->kargc, argv, environ));
113}
114
115#ifdef CRT0
116/*
117 * null mcount and moncontrol,
118 * just in case some routine is compiled for profiling
119 */
120moncontrol(val)
121        int val;
122{
123
124}
125asm(".globl mcount");
126asm("mcount: ret");
127#endif CRT0
Note: See TracBrowser for help on using the repository browser.