X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/14b86eca7f36eedde35cb47b41afc36f9097ea7c..d251b620d312e819923e55e223e0eb43b72a3bc6:/lunaix-os/kernel/process.c diff --git a/lunaix-os/kernel/process.c b/lunaix-os/kernel/process.c index 87a7413..c4e348f 100644 --- a/lunaix-os/kernel/process.c +++ b/lunaix-os/kernel/process.c @@ -1,10 +1,12 @@ #include #include #include +#include #include #include #include #include +#include #include #include @@ -14,7 +16,9 @@ void* __dup_pagetable(pid_t pid, uintptr_t mount_point) { void* ptd_pp = pmm_alloc_page(pid, PP_FGPERSIST); - x86_page_table* ptd = vmm_fmap_page(pid, PG_MOUNT_1, ptd_pp, PG_PREM_RW); + vmm_set_mapping(PD_REFERENCED, PG_MOUNT_1, ptd_pp, PG_PREM_RW, VMAP_NULL); + + x86_page_table* ptd = PG_MOUNT_1; x86_page_table* pptd = (x86_page_table*)(mount_point | (0x3FF << 12)); for (size_t i = 0; i < PG_MAX_ENTRIES - 1; i++) { @@ -24,9 +28,12 @@ __dup_pagetable(pid_t pid, uintptr_t mount_point) continue; } - x86_page_table* ppt = (x86_page_table*)(mount_point | (i << 12)); void* pt_pp = pmm_alloc_page(pid, PP_FGPERSIST); - x86_page_table* pt = vmm_fmap_page(pid, PG_MOUNT_2, pt_pp, PG_PREM_RW); + vmm_set_mapping( + PD_REFERENCED, PG_MOUNT_2, pt_pp, PG_PREM_RW, VMAP_NULL); + + x86_page_table* ppt = (x86_page_table*)(mount_point | (i << 12)); + x86_page_table* pt = PG_MOUNT_2; for (size_t j = 0; j < PG_MAX_ENTRIES; j++) { x86_pte_t pte = ppt->entry[j]; @@ -90,6 +97,36 @@ __DEFINE_LXSYSCALL(pid_t, getppid) return __current->parent->pid; } +__DEFINE_LXSYSCALL(pid_t, getpgid) +{ + return __current->pgid; +} + +__DEFINE_LXSYSCALL2(int, setpgid, pid_t, pid, pid_t, pgid) +{ + struct proc_info* proc = pid ? get_process(pid) : __current; + + if (!proc) { + __current->k_status = LXINVL; + return -1; + } + + pgid = pgid ? pgid : proc->pid; + + struct proc_info* gruppenfuhrer = get_process(pgid); + + if (!gruppenfuhrer || proc->pgid == proc->pid) { + __current->k_status = LXINVL; + return -1; + } + + llist_delete(&proc->grp_member); + llist_append(&gruppenfuhrer->grp_member, &proc->grp_member); + + proc->pgid = pgid; + return 0; +} + void init_proc(struct proc_info* pcb) { @@ -98,6 +135,7 @@ init_proc(struct proc_info* pcb) pcb->pid = alloc_pid(); pcb->created = clock_systime(); pcb->state = PROC_CREATED; + pcb->pgid = pcb->pid; } pid_t