- if (!argv_extra[1]) {
- // If loading a statically linked file, then heap remapping we can do,
- // otherwise delayed.
- create_heap(vmspace(proc), page_aligned(container->exe.end));
- }
-
- if (container->vms_mnt == VMS_SELF) {
- // we are loading executable into current addr space
-
- ptr_t ustack = container->stack_top;
- size_t argv_len = 0, envp_len = 0;
- ptr_t argv_ptr = 0, envp_ptr = 0;
-
- if (envp) {
- argv_len = args_ptr_size(envp);
- ustack -= envp_len;
- envp_ptr = ustack;
-
- memcpy((void*)ustack, (const void*)envp, envp_len);
- ustack = copy_to_ustack(ustack, (ptr_t*)ustack);
- } else {
- ustack -= sizeof(ptr_t);
- *((ptr_t*)ustack) = 0;
- }
-
- if (argv) {
- argv_len = args_ptr_size(argv);
- ustack -= argv_len;
-
- memcpy((void*)ustack, (const void**)argv, argv_len);
- } else {
- ustack -= sizeof(ptr_t);
- *((ptr_t*)ustack) = 0;
- }
-
- for (size_t i = 0; i < 2 && argv_extra[i]; i++) {
- ustack -= sizeof(ptr_t);
- *((ptr_t*)ustack) = (ptr_t)argv_extra[i];
- argv_len += sizeof(ptr_t);
- }
-
- argv_ptr = ustack;
- ustack = copy_to_ustack(ustack, (ptr_t*)ustack);
-
- save_process_cmd(proc, (ptr_t*)argv_ptr);
-
- // four args (arg{c|v}, env{c|p}) for main
- struct uexec_param* exec_param = &((struct uexec_param*)ustack)[-1];
-
- container->stack_top = (ptr_t)exec_param;
-
- *exec_param =
- (struct uexec_param){ .argc = (argv_len - 1) / sizeof(ptr_t),
- .argv = (char**)argv_ptr,
- .envc = (envp_len - 1) / sizeof(ptr_t),
- .envp = (char**)envp_ptr };
- } else {