1994-05-24 11:33:47 +04:00
|
|
|
/*
|
|
|
|
* Copyright (c) 1991, 1993
|
|
|
|
* The Regents of the University of California. All rights reserved.
|
|
|
|
*
|
|
|
|
* This code is derived from software contributed to Berkeley by
|
|
|
|
* Ralph Campbell.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
|
|
* must display the following acknowledgement:
|
|
|
|
* This product includes software developed by the University of
|
|
|
|
* California, Berkeley and its contributors.
|
|
|
|
* 4. Neither the name of the University nor the names of its contributors
|
|
|
|
* may be used to endorse or promote products derived from this software
|
|
|
|
* without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*
|
|
|
|
* from: @(#)crt0.s 8.2 (Berkeley) 3/21/94
|
1994-11-15 02:33:46 +03:00
|
|
|
* $Id: crt0.S,v 1.2 1994/11/14 23:34:40 dean Exp $
|
1994-05-24 11:33:47 +04:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <machine/regdef.h>
|
|
|
|
#include <machine/machAsmDefs.h>
|
|
|
|
|
|
|
|
.data
|
1994-11-15 02:33:46 +03:00
|
|
|
.comm _environ, 4
|
1994-05-24 11:33:47 +04:00
|
|
|
.align 2
|
1994-11-15 02:33:46 +03:00
|
|
|
.globl ___progname
|
|
|
|
___progname:
|
1994-05-24 11:33:47 +04:00
|
|
|
.word $L1
|
|
|
|
$L1:
|
|
|
|
.word 0 # null string plus padding
|
|
|
|
.text
|
|
|
|
|
1994-11-15 02:33:46 +03:00
|
|
|
NON_LEAF(_start, 24, ra)
|
1994-05-24 11:33:47 +04:00
|
|
|
.set noreorder
|
|
|
|
lw s0, 0(sp) # get argc from stack
|
|
|
|
addu s1, sp, 4 # get pointer to argv
|
|
|
|
addu s2, s1, 4 # skip null pointer on stack
|
|
|
|
sll v0, s0, 2 # add number of argv pointers
|
|
|
|
addu s2, s2, v0 # final pointer to environment list
|
1994-11-15 02:33:46 +03:00
|
|
|
sw s2, _environ # save environment pointer
|
1994-05-24 11:33:47 +04:00
|
|
|
subu sp, sp, 24 # allocate standard frame
|
|
|
|
.mask 0x80000000, -4
|
|
|
|
sw zero, 20(sp) # clear return address for debugging
|
|
|
|
#ifdef MCRT0
|
|
|
|
eprol:
|
|
|
|
la a0, eprol
|
|
|
|
la a1, etext
|
1994-11-15 02:33:46 +03:00
|
|
|
jal _monstartup # monstartup(eprol, etext);
|
1994-05-24 11:33:47 +04:00
|
|
|
nop
|
|
|
|
la a0, _mcleanup
|
1994-11-15 02:33:46 +03:00
|
|
|
jal _atexit # atext(_mcleanup);
|
1994-05-24 11:33:47 +04:00
|
|
|
nop
|
1994-11-15 02:33:46 +03:00
|
|
|
sw zero, _errno
|
1994-05-24 11:33:47 +04:00
|
|
|
#endif
|
|
|
|
lw a0, 0(s1) # a0 = argv[0];
|
|
|
|
nop
|
|
|
|
beq a0, zero, 2f # skip if a0 == NULL
|
|
|
|
move s3, a0 # save argv[0]
|
1994-11-15 02:33:46 +03:00
|
|
|
jal _strrchr
|
1994-05-24 11:33:47 +04:00
|
|
|
li a1, 0x2f # a1 = '/'
|
|
|
|
bne v0, zero, 1f # if slash found
|
|
|
|
addu v0, v0, 1
|
|
|
|
move v0, s3 # v0 = argv[0];
|
|
|
|
1:
|
1994-11-15 02:33:46 +03:00
|
|
|
sw v0, ___progname
|
1994-05-24 11:33:47 +04:00
|
|
|
2:
|
|
|
|
move a0, s0
|
|
|
|
move a1, s1
|
1994-11-15 02:33:46 +03:00
|
|
|
jal _main # v0 = main(argc, argv, env);
|
1994-05-24 11:33:47 +04:00
|
|
|
move a2, s2
|
1994-11-15 02:33:46 +03:00
|
|
|
jal _exit # exit(v0);
|
1994-05-24 11:33:47 +04:00
|
|
|
move a0, v0
|
|
|
|
break 0
|
|
|
|
.set reorder
|
1994-11-15 02:33:46 +03:00
|
|
|
END(_start)
|
1994-05-24 11:33:47 +04:00
|
|
|
|
|
|
|
#ifndef MCRT0
|
1994-11-15 02:33:46 +03:00
|
|
|
LEAF(_moncontrol)
|
1994-05-24 11:33:47 +04:00
|
|
|
j ra
|
1994-11-15 02:33:46 +03:00
|
|
|
END(_moncontrol)
|
1994-05-24 11:33:47 +04:00
|
|
|
|
1994-11-15 02:33:46 +03:00
|
|
|
LEAF(__mcount)
|
1994-05-24 11:33:47 +04:00
|
|
|
.set noreorder
|
|
|
|
.set noat
|
|
|
|
addu sp, sp, 8 # undo push
|
|
|
|
j ra
|
|
|
|
move ra, AT
|
|
|
|
.set at
|
|
|
|
.set reorder
|
1994-11-15 02:33:46 +03:00
|
|
|
END(__mcount)
|
1994-05-24 11:33:47 +04:00
|
|
|
#endif
|