summaryrefslogtreecommitdiff
path: root/lib/libc/src/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/libc/src/main.c')
-rw-r--r--lib/libc/src/main.c44
1 files changed, 43 insertions, 1 deletions
diff --git a/lib/libc/src/main.c b/lib/libc/src/main.c
index 1154b21..02a648b 100644
--- a/lib/libc/src/main.c
+++ b/lib/libc/src/main.c
@@ -27,13 +27,55 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include <sys/exec.h>
#include <stdint.h>
#include <stddef.h>
+extern int __libc_stdio_init(void);
+extern int __malloc_mem_init(void);
+uint64_t __libc_auxv[_AT_MAX];
+
int main(int argc, char **argv);
+struct auxv_entry {
+ uint64_t tag;
+ uint64_t val;
+};
+
int
__libc_entry(uint64_t *ctx)
{
- return main(0, NULL);
+ const struct auxv_entry *auxvp;
+ int status;
+ uint64_t argc, envc, tag;
+ char **argv;
+ char **envp;
+
+ argc = *ctx;
+ argv = (char **)(ctx + 1);
+ envp = (char **)(argv + argc + 1);
+
+ envc = 0;
+ while (envp[envc] != NULL) {
+ ++envc;
+ }
+
+ auxvp = (void *)(envp + envc + 1);
+ for (int i = 0; i < _AT_MAX; ++i) {
+ if (auxvp->tag == AT_NULL) {
+ break;
+ }
+ if (auxvp->tag < _AT_MAX) {
+ __libc_auxv[auxvp->tag] = auxvp->val;
+ }
+
+ ++auxvp;
+ }
+
+ if ((status = __libc_stdio_init()) != 0) {
+ return status;
+ }
+
+ __malloc_mem_init();
+ return main(argc, argv);
}