Annotation of 43BSDReno/lib/csu.hp300/crt0.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1980 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  */
        !             6: 
        !             7: #if defined(LIBC_SCCS) && !defined(lint)
        !             8: static char sccsid[] = "@(#)crt0.c     5.3 (Berkeley) 3/9/86";
        !             9: #endif LIBC_SCCS and not lint
        !            10: 
        !            11: /*
        !            12:  *     C start up routine.
        !            13:  *     Robert Henry, UCB, 20 Oct 81
        !            14:  *
        !            15:  *     We make the following (true) assumptions:
        !            16:  *     1) when the kernel calls start, it does a jump to location 2,
        !            17:  *     and thus avoids the register save mask.  We are NOT called
        !            18:  *     with a calls!  see sys1.c:setregs().
        !            19:  *     2) The only register variable that we can trust is sp,
        !            20:  *     which points to the base of the kernel calling frame.
        !            21:  *     Do NOT believe the documentation in exec(2) regarding the
        !            22:  *     values of fp and ap.
        !            23:  *     3) We can allocate as many register variables as we want,
        !            24:  *     and don't have to save them for anybody.
        !            25:  *     4) Because of the ways that asm's work, we can't have
        !            26:  *     any automatic variables allocated on the stack, because
        !            27:  *     we must catch the value of sp before any automatics are
        !            28:  *     allocated.
        !            29:  */
        !            30: 
        !            31: char **environ = (char **)0;
        !            32: static int fd;
        !            33: 
        !            34: asm("#define _start start");
        !            35: asm("#define _eprol eprol");
        !            36: 
        !            37: #ifdef hp300
        !            38: asm("#define link .long 0; linkw");    /* Yuk!! */
        !            39: #endif
        !            40: 
        !            41: extern unsigned char   etext;
        !            42: extern unsigned char   eprol;
        !            43: start()
        !            44: {
        !            45:        struct kframe {
        !            46:                int     kargc;
        !            47:                char    *kargv[1];      /* size depends on kargc */
        !            48:                char    kargstr[1];     /* size varies */
        !            49:                char    kenvstr[1];     /* size varies */
        !            50:        };
        !            51:        /*
        !            52:         *      ALL REGISTER VARIABLES!!!
        !            53:         */
        !            54:        register int d7;                /* needed for init (this will be
        !            55:                                           a problem with GCC) */
        !            56:        register struct kframe *kfp;    /* PCC a5 */
        !            57:        register char **targv;
        !            58:        register char **argv;
        !            59:        extern int errno;
        !            60: 
        !            61: #ifdef lint
        !            62:        kfp = 0;
        !            63:        initcode = initcode = 0;
        !            64: #else not lint
        !            65: #ifdef __GNUC__
        !            66:        asm("lea a6@(4),%0" : "=r" (kfp));      /* catch it quick */
        !            67: #else
        !            68:        asm("   lea     a6@(4),a5");    /* catch it quick */
        !            69: #endif
        !            70: #endif not lint
        !            71:        for (argv = targv = &kfp->kargv[0]; *targv++; /* void */)
        !            72:                /* void */ ;
        !            73:        if (targv >= (char **)(*argv))
        !            74:                --targv;
        !            75:        environ = targv;
        !            76: asm("eprol:");
        !            77: 
        !            78: #ifdef paranoid
        !            79:        /*
        !            80:         * The standard I/O library assumes that file descriptors 0, 1, and 2
        !            81:         * are open. If one of these descriptors is closed prior to the start 
        !            82:         * of the process, I/O gets very confused. To avoid this problem, we
        !            83:         * insure that the first three file descriptors are open before calling
        !            84:         * main(). Normally this is undefined, as it adds two unnecessary
        !            85:         * system calls.
        !            86:         */
        !            87:        do      {
        !            88:                fd = open("/dev/null", 2);
        !            89:        } while (fd >= 0 && fd < 3);
        !            90:        close(fd);
        !            91: #endif paranoid
        !            92: 
        !            93: #ifdef MCRT0
        !            94:        monstartup(&eprol, &etext);
        !            95: #endif MCRT0
        !            96:        errno = 0;
        !            97:        exit(main(kfp->kargc, argv, environ));
        !            98: }
        !            99: asm("#undef link");
        !           100: asm("#undef _start");
        !           101: asm("#undef _eprol");
        !           102: 
        !           103: #ifdef MCRT0
        !           104: /*ARGSUSED*/
        !           105: exit(code)
        !           106:        register int code;      /* PCC d7 */
        !           107: {
        !           108:        monitor(0);
        !           109:        _cleanup();
        !           110: #ifdef __GNUC__
        !           111:        asm("movl %1,sp@-" : "=m" (*(char *)0) : "r" (code));
        !           112: #else
        !           113:        asm("   movl d7,sp@-");
        !           114: #endif
        !           115:        asm("   subql #4,sp");
        !           116:        asm("   movl #1,d0");
        !           117:        asm("   trap #0");
        !           118: }
        !           119: #endif MCRT0
        !           120: 
        !           121: #ifdef CRT0
        !           122: /*
        !           123:  * null mcount and moncontrol,
        !           124:  * just in case some routine is compiled for profiling
        !           125:  */
        !           126: moncontrol(val)
        !           127:        int val;
        !           128: {
        !           129: 
        !           130: }
        !           131: asm("  .globl  mcount");
        !           132: asm("mcount:   rts");
        !           133: #endif CRT0

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.