diff --git a/src/libraries/libc/arch/amd64/crt/crt0.s b/src/libraries/libc/arch/amd64/crt/crt0.s index 85a781f..e0abdde 100644 --- a/src/libraries/libc/arch/amd64/crt/crt0.s +++ b/src/libraries/libc/arch/amd64/crt/crt0.s @@ -87,11 +87,16 @@ _libc_crt0_start: call __run_global_ctors + ; argc mov rdi, [r15] + + ; argv mov rsi, r15 add rsi, 8 - mov rdx, 0 ; TODO: actually parse stack for argc, argv, envp - mov rcx, rbx + + ; envp + lea rdx, [rsi + rdi*8 + 8] + lookup_GOT main call rax diff --git a/src/user/drv.uart/main.cpp b/src/user/drv.uart/main.cpp index 7546b6c..351a0ea 100644 --- a/src/user/drv.uart/main.cpp +++ b/src/user/drv.uart/main.cpp @@ -20,7 +20,7 @@ #include "serial.h" extern "C" { - int main(int, const char **); + int main(int, const char **, const char **envp); } j6_handle_t g_handle_sys = j6_handle_invalid; @@ -36,7 +36,7 @@ uint8_t com2_out[out_buf_size]; constexpr uintptr_t stack_top = 0xf80000000; int -main(int argc, const char **argv) +main(int argc, const char **argv, const char **envp) { j6::syslog(j6::logs::srv, j6::log_level::info, "uart driver starting"); diff --git a/src/user/srv.init/loader.cpp b/src/user/srv.init/loader.cpp index de857e4..bbb22c5 100644 --- a/src/user/srv.init/loader.cpp +++ b/src/user/srv.init/loader.cpp @@ -71,6 +71,8 @@ public: } void build() { + *push() = 0; + if ((m_argv.count() + m_envp.count()) % 2 == 0) *push() = 0; // Pad for 16-byte alignment @@ -268,6 +270,9 @@ load_program( stack_top, }; + stack.add_arg(path); + stack.add_env("jsix_version", GIT_VERSION); + static constexpr size_t nhandles = 3; static constexpr size_t handles_extra = 3 * sizeof(j6_arg_handle_entry); j6_arg_handles *handles_arg = stack.add_aux_data(j6_aux_handles, handles_extra);