refactor: separate syscall interfaces from kernel space, into posix compliant structure.
[lunaix-os.git] / lunaix-os / kernel / process / process.c
index e30e46120a21b4e213c4087d10f158cc7352ca99..9cef1f87ac40a70a7b9502607187a4d2fba1de57 100644 (file)
@@ -123,7 +123,7 @@ __DEFINE_LXSYSCALL2(int, setpgid, pid_t, pid, pid_t, pgid)
 
     struct proc_info* gruppenfuhrer = get_process(pgid);
 
-    if (!gruppenfuhrer || proc->pgid == proc->pid) {
+    if (!gruppenfuhrer || proc->pgid == gruppenfuhrer->pid) {
         __current->k_status = EINVAL;
         return -1;
     }
@@ -142,9 +142,12 @@ init_proc_user_space(struct proc_info* pcb)
 
     /*---  分配用户栈  ---*/
 
+    struct mm_region* stack_vm;
+
+    stack_vm = region_create(
+      USTACK_END, USTACK_TOP, REGION_RW | REGION_RSHARED | REGION_ANON);
     // 注册用户栈区域
-    region_add(
-      &pcb->mm.regions, USTACK_END, USTACK_TOP, REGION_RW | REGION_RSHARED);
+    region_add(&pcb->mm.regions, stack_vm);
 
     // 预留地址空间,具体物理页将由Page Fault Handler按需分配。
     for (uintptr_t i = PG_ALIGN(USTACK_END); i < USTACK_TOP; i += PG_SIZE) {
@@ -196,6 +199,13 @@ dup_proc()
     pcb->intr_ctx = __current->intr_ctx;
     pcb->parent = __current;
 
+    memcpy(pcb->fxstate, __current->fxstate, 512);
+
+    if (__current->cwd) {
+        pcb->cwd = __current->cwd;
+        vfs_ref_dnode(pcb->cwd);
+    }
+
     __copy_fdtable(pcb);
     region_copy(&__current->mm.regions, &pcb->mm.regions);
 
@@ -204,7 +214,7 @@ dup_proc()
     // 根据 mm_region 进一步配置页表
 
     struct mm_region *pos, *n;
-    llist_for_each(pos, n, &pcb->mm.regions.head, head)
+    llist_for_each(pos, n, &pcb->mm.regions, head)
     {
         // 如果写共享,则不作处理。
         if ((pos->attr & REGION_WSHARED)) {