aboutsummaryrefslogtreecommitdiff
path: root/sys/rt/boot.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/rt/boot.c')
-rw-r--r--sys/rt/boot.c57
1 files changed, 32 insertions, 25 deletions
diff --git a/sys/rt/boot.c b/sys/rt/boot.c
index 197e861..76f5599 100644
--- a/sys/rt/boot.c
+++ b/sys/rt/boot.c
@@ -1,34 +1,41 @@
+#include <u.h>
#include <rt.h>
+#include <elf.h>
-int
-rt·boot(
- int (*main)(int,char **,char **), int argc, char **argv,
- int (*init)(int, char **, char **), void (*fini)(void),
- void (*exit)(void)
-)
+/* tell linker to go find */
+int __libc_start_main(int (*main)(int,char **,char **), int argc, char **argv);
+
+#define NAUX 38
+static void
+rt·init(char **env, char *program)
{
- char **envp = argv+argc+1;
- rt·environ = envp;
+ uintptr i, *auxv, aux[NAUX];
+ for(i=0; env[i]; i++)
+ ;
+ rt·context.auxv = auxv = (void *)(env+i+1);
+ for(i=0; auxv[i]; i+=2)
+ if(auxv[i]<NAUX)
+ aux[auxv[i]] = auxv[i+1];
- if(exit)
- rt·context.exit = exit;
+ rt·context.sysinfo = aux[AT_SYSINFO];
+ rt·context.pagesize = aux[AT_PAGESZ];
+}
- if(fini)
- rt·context.fini = fini;
+int
+rt·boot(int (*main)(), int argc, char **argv, void (*init)(), void (*fini)(), void (*exit)())
+{
+ char **env = argv+argc+1;
+ rt·init(env, argv[0]);
- if(init){
- rt·context.init = init;
- init(argc, argv, envp);
- }
+ /* ring libc, anyone home? */
+ __libc_start_main(main, argc, argv);
- /* XXX:
- * we could call __libc_start_main of musl here:
- * this would give us the normal C runtime along with ours
- * which would allow seamless linking to other libraries
- * or we can implement a compatibility layer
- */
- rt·exit(main(argc, argv, envp));
+ /* no? ok we continue on if there is no libc linked */
+ init();
+ if(fini)
+ rt·context.fini = fini;
+ if(exit)
+ rt·context.exit = exit;
- /* should never get here */
- return 0;
+ rt·exit(main(argc, argv, env));
}