feat: refine symbolic link support.
[lunaix-os.git] / lunaix-os / kernel / loader / exec.c
index cf0a422e2f1d7acab87cc8253d61fb1667ba4abb..6a18ffca11d91bdbeec592bd7b84689266473f11 100644 (file)
@@ -7,6 +7,7 @@
 #include <lunaix/spike.h>
 #include <lunaix/status.h>
 #include <lunaix/syscall.h>
+#include <lunaix/syscall_utils.h>
 
 #include <klibc/string.h>
 
@@ -25,11 +26,11 @@ exec_str_size(const char** str_arr, size_t* length)
         sz += strlen(chr);
         len++;
 
-        chr = *(str_arr + sz);
+        chr = *(str_arr++);
     }
 
     *length = len;
-    return sz + 1;
+    return sz + sizeof(char*);
 }
 
 void
@@ -47,10 +48,10 @@ __exec_remap_heap(struct ld_param* param, struct proc_mm* pvms)
 
     struct mmap_param map_param = { .pvms = pvms,
                                     .vms_mnt = param->vms_mnt,
-                                    .flags = MAP_ANON | MAP_PRIVATE | MAP_FIXED,
+                                    .flags = MAP_ANON | MAP_PRIVATE,
                                     .type = REGION_TYPE_HEAP,
                                     .proct = PROT_READ | PROT_WRITE,
-                                    .mlen = DEFAULT_HEAP_PAGES * PG_SIZE };
+                                    .mlen = PG_SIZE };
     int status = 0;
     struct mm_region* heap;
     if ((status = mem_map(NULL, &heap, param->info.end, NULL, &map_param))) {
@@ -115,7 +116,7 @@ exec_load(struct ld_param* param,
             memcpy(arg_start + sz_argv, (void*)envp, sz_envp);
 
         ptr_t* ustack = (ptr_t*)USTACK_TOP;
-        struct usr_exec_param* exec_param = mapped;
+        struct usr_exec_param* exec_param = (struct usr_exec_param*)mapped;
 
         ustack[-1] = (ptr_t)mapped;
         param->info.stack_top = &ustack[-1];
@@ -127,6 +128,8 @@ exec_load(struct ld_param* param,
                                                .info = param->info };
     } else {
         // TODO need to find a way to inject argv and envp remotely
+        //      this is for the support of kernel level implementation of
+        //      posix_spawn
         fail("not implemented");
     }
 
@@ -181,15 +184,16 @@ __DEFINE_LXSYSCALL3(int,
             schedule();
             fail("should not reach");
         }
+        goto done;
     }
 
-    isr_param* intr_ctx = &__current->intr_ctx;
-    intr_ctx->esp = ldparam.info.stack_top;
-    intr_ctx->eip = ldparam.info.entry;
+    volatile struct exec_param* execp = __current->intr_ctx.execp;
+    execp->esp = ldparam.info.stack_top;
+    execp->eip = ldparam.info.entry;
 
     // we will jump to new entry point (_u_start) upon syscall's
     // return so execve 'will not return' from the perspective of it's invoker
 
 done:
-    return errno;
+    return DO_STATUS(errno);
 }
\ No newline at end of file