PERFORCE change 115070 for review

Oleksandr Tymoshenko gonzo at FreeBSD.org
Mon Feb 26 17:24:36 UTC 2007


http://perforce.freebsd.org/chv.cgi?CH=115070

Change 115070 by gonzo at gonzo_jeeves on 2007/02/26 17:23:47

	o Pass obj_main, ps_strings and cleanup procedure 
	    as arguments to __start.

Affected files ...

.. //depot/projects/mips2/src/lib/csu/mips/crt1.c#6 edit

Differences ...

==== //depot/projects/mips2/src/lib/csu/mips/crt1.c#6 (text+ko) ====

@@ -51,7 +51,6 @@
 #include "crtbrand.c"
 #include <machine/asm.h>
 
-typedef void (*fptr)(void);
 struct Struct_Obj_Entry;
 struct ps_strings;
 
@@ -73,6 +72,7 @@
 
 char **environ;
 const char *__progname = "";
+struct ps_strings *__ps_strings;
 
 /* The entry function. */
 __asm("	.text			\n"
@@ -80,6 +80,10 @@
 "	.globl	_start		\n"
 "	_start:			\n"
 "	.cpload $25		\n"
+"	/* Get cleanup routine and main object set by rtld */\n"
+"	/* Note that a2 is already set to ps_string by _rtld_start */\n"
+"	/* move	a3, a0        */\n"
+"	/* move	t0, a1        */\n"
 "	/* Get argc, argv from stack */	\n"
 "	/* lw	a0, 0(sp)     */\n"
 "	/* move	a1, sp        */\n"
@@ -89,12 +93,18 @@
 "	/* required by ABI to pass     */\n"
 "	/* 64-bits arguments           */\n"
 "	/* and	sp, ~8        */\n"
+"	/* subu	sp, sp, 20    */\n"
+"	/* sw	t0, 16(sp)    */\n"
 "				\n"
+"	move	$7, $4		/* atexit */\n"
+"	move	$8, $5		/* main_obj entry */\n"
 "	lw	$4, 0($29)	\n"
 "	move	$5, $29		\n"
 "	addu	$5, 4		\n"
 "				\n"
 "	and	$29, 0xfffffff8	\n"
+"	subu	$29, $29, 24	/* args slot + cleanup + 4 bytes padding */ \n"
+"	sw	$8, 16($29)	\n"
 "\n"
 "	la	 $25, __start  \n"
 "	nop	 \n"
@@ -102,12 +112,11 @@
 /* ARGSUSED */
 
 void
-__start(int argc, char **argv)
+__start(int argc, char **argv, struct ps_strings *ps_strings,
+     void (*cleanup)(void), const struct Struct_Obj_Entry *obj __unused)
 {
 	char **env;
 	const char *s;
-	/* XXXMIPS: proper set a cleanup procedure */
-	fptr cleanup = NULL;
 
 	env = argv + argc + 1;
 	environ = env;
@@ -119,10 +128,14 @@
 				__progname = s + 1;
 	}
 
+	if (ps_strings != (struct ps_strings *)0)
+		__ps_strings = ps_strings;
+
 	if (&_DYNAMIC != NULL)
 		atexit(cleanup);
 	else
 		_init_tls();
+
 #ifdef GCRT
 	atexit(_mcleanup);
 #endif


More information about the p4-projects mailing list