summaryrefslogtreecommitdiffstats
path: root/lib/csu/i386/crt0.c
diff options
context:
space:
mode:
authorbde <bde@FreeBSD.org>1997-07-03 03:28:27 +0000
committerbde <bde@FreeBSD.org>1997-07-03 03:28:27 +0000
commite2f0a0f35c8c3ecbae359c67f0d5b3aac5ce43dc (patch)
treecfd1bb56bef2f8964dc85e334b5f5531a8997455 /lib/csu/i386/crt0.c
parent4e789e88d887b2015822fd4ddb14016866f05f97 (diff)
downloadFreeBSD-src-e2f0a0f35c8c3ecbae359c67f0d5b3aac5ce43dc.zip
FreeBSD-src-e2f0a0f35c8c3ecbae359c67f0d5b3aac5ce43dc.tar.gz
Import Lite2's src/lib, except for non-i386 machine-dependent directories,
libc/db, libc/gen/crypt.* and libtelnet. All affected files except 3 unimportant ones have already left the vendor branch.
Diffstat (limited to 'lib/csu/i386/crt0.c')
-rw-r--r--lib/csu/i386/crt0.c66
1 files changed, 44 insertions, 22 deletions
diff --git a/lib/csu/i386/crt0.c b/lib/csu/i386/crt0.c
index 363098b..77f9382 100644
--- a/lib/csu/i386/crt0.c
+++ b/lib/csu/i386/crt0.c
@@ -1,6 +1,6 @@
/*-
- * Copyright (c) 1990 The Regents of the University of California.
- * All rights reserved.
+ * Copyright (c) 1990, 1993
+ * The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -31,22 +31,27 @@
* SUCH DAMAGE.
*/
-#if defined(LIBC_SCCS) && !defined(lint)
-static char sccsid[] = "@(#)crt0.c 5.7 (Berkeley) 7/3/91";
-#endif /* LIBC_SCCS and not lint */
-
+#ifndef lint
+static char sccsid[] = "@(#)crt0.c 8.1 (Berkeley) 6/1/93";
+#endif /* not lint */
/*
* C start up routine.
* Robert Henry, UCB, 20 Oct 81
*
* We make the following (true) assumption:
- * 1) The only register variable that we can trust is the frame pointer,
- * ebp, which points to the base of the kernel calling frame.
+ * 1) The only register variable that we can trust is ebp,
+ * which points to the base of the kernel calling frame.
*/
-char **environ = (char **)0;
-int errno = 0;
+#include <stddef.h>
+#include <stdlib.h>
+#include <string.h>
+
+char **environ = (char **)0;
+static char empty[1];
+char *__progname = empty;
+static int fd;
asm(".text");
asm(".long 0xc000c000");
@@ -54,7 +59,6 @@ asm(".long 0xc000c000");
extern unsigned char etext;
extern unsigned char eprol asm ("eprol");
extern start() asm("start");
-extern mcount() asm ("mcount");
start()
{
@@ -67,18 +71,18 @@ start()
/*
* ALL REGISTER VARIABLES!!!
*/
- register struct kframe *kfp;
+ register struct kframe *kfp; /* r10 */
register char **targv;
register char **argv;
+ extern int errno;
extern void _mcleanup();
#ifdef lint
kfp = 0;
initcode = initcode = 0;
-#else not lint
- /* just above the saved frame pointer */
- asm ("lea 4(%%ebp), %0" : "=r" (kfp) );
-#endif not lint
+#else
+ asm("lea 4(%ebp),%ebx"); /* catch it quick */
+#endif
for (argv = targv = &kfp->kargv[0]; *targv++; /* void */)
/* void */ ;
if (targv >= (char **)(*argv))
@@ -86,23 +90,41 @@ start()
environ = targv;
asm("eprol:");
+#ifdef paranoid
+ /*
+ * The standard I/O library assumes that file descriptors 0, 1, and 2
+ * are open. If one of these descriptors is closed prior to the start
+ * of the process, I/O gets very confused. To avoid this problem, we
+ * insure that the first three file descriptors are open before calling
+ * main(). Normally this is undefined, as it adds two unnecessary
+ * system calls.
+ */
+ do {
+ fd = open("/dev/null", 2);
+ } while (fd >= 0 && fd < 3);
+ close(fd);
+#endif
+
#ifdef MCRT0
atexit(_mcleanup);
monstartup(&eprol, &etext);
-#endif MCRT0
+#endif
+ errno = 0;
+ if (argv[0])
+ if ((__progname = strrchr(argv[0], '/')) == NULL)
+ __progname = argv[0];
+ else
+ ++__progname;
exit(main(kfp->kargc, argv, environ));
}
#ifdef CRT0
/*
- * null mcount and moncontrol,
- * just in case some routine is compiled for profiling
+ * null moncontrol just in case some routine is compiled for profiling
*/
moncontrol(val)
int val;
{
}
-
-mcount() { }
-#endif CRT0
+#endif
OpenPOWER on IntegriCloud