OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [newlib-1.17.0/] [newlib/] [libc/] [sys/] [sysvi386/] [crt0.c] - Blame information for rev 438

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 148 jeremybenn
/*-
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)
35
static 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
 
47
char **environ = (char **)0;
48
static int fd;
49
 
50
/*
51
asm(".text");
52
asm(".long 0xc000c000");
53
*/
54
extern  unsigned char   etext;
55
extern  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;
90
asm("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
 */
120
moncontrol(val)
121
        int val;
122
{
123
 
124
}
125
asm(".globl mcount");
126
asm("mcount: ret");
127
#endif CRT0

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.