From 665ad725f77c4c56579e14fe3e8bc3efc359f982 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 30 Apr 2003 19:27:07 +0000 Subject: Update for AMD64. repocopied from i386-elf/crt1.c. Deal with regparm argument passing rather than stack based args. The kernel passes the base of the argument/env vector in %rdi (arg1). --- lib/csu/amd64/crt1.c | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) (limited to 'lib/csu/amd64/crt1.c') diff --git a/lib/csu/amd64/crt1.c b/lib/csu/amd64/crt1.c index 15a544c..15aec44 100644 --- a/lib/csu/amd64/crt1.c +++ b/lib/csu/amd64/crt1.c @@ -43,7 +43,7 @@ typedef void (*fptr)(void); extern void _fini(void); extern void _init(void); extern int main(int, char **, char **); -extern void _start(char *, ...); +extern void _start(char **, void (*)(void)); #ifdef GCRT extern void _mcleanup(void); @@ -55,33 +55,18 @@ extern int etext; char **environ; const char *__progname = ""; -static __inline fptr -get_rtld_cleanup(void) -{ - fptr retval; - -#ifdef __GNUC__ - __asm__("movl %%edx,%0" : "=rm"(retval)); -#else - retval = (fptr)0; /* XXXX Fix this for other compilers */ -#endif - return(retval); -} - /* The entry function. */ void -_start(char *ap, ...) +_start(char **ap, void (*cleanup)(void)) { - fptr cleanup; int argc; char **argv; char **env; const char *s; - cleanup = get_rtld_cleanup(); - argv = ≈ - argc = *(long *)(void *)(argv - 1); - env = argv + argc + 1; + argc = *(long *)(void *)ap; + argv = ap + 1; + env = ap + 2 + argc; environ = env; if (argc > 0 && argv[0] != NULL) { __progname = argv[0]; -- cgit v1.1