Multiuser, Capabilities and Access Controls (#54)
[lunaix-os.git] / lunaix-os / kernel / process / fork.c
index 6dbe737206c8e2d4f8a698795bfd9430625c7ad3..674e5c64b43199ad5651cde82d00010f94e0aca3 100644 (file)
@@ -8,9 +8,10 @@
 #include <lunaix/syscall.h>
 #include <lunaix/syslog.h>
 #include <lunaix/signal.h>
+#include <lunaix/kpreempt.h>
 
-#include <sys/abi.h>
-#include <sys/mm/mm_defs.h>
+#include <asm/abi.h>
+#include <asm/mm_defs.h>
 
 #include <klibc/string.h>
 
@@ -62,12 +63,12 @@ __dup_kernel_stack(struct thread* thread, ptr_t vm_mnt)
     struct leaflet* leaflet;
 
     ptr_t kstack_pn = pfn(current_thread->kstack);
-    kstack_pn -= pfn(KSTACK_SIZE) - 1;
+    kstack_pn -= pfn(KSTACK_SIZE);
 
     // copy the kernel stack
     pte_t* src_ptep = mkptep_pn(VMS_SELF, kstack_pn);
     pte_t* dest_ptep = mkptep_pn(vm_mnt, kstack_pn);
-    for (size_t i = 0; i < pfn(KSTACK_SIZE); i++) {
+    for (size_t i = 0; i <= pfn(KSTACK_SIZE); i++) {
         pte_t p = *src_ptep;
 
         if (pte_isguardian(p)) {
@@ -149,9 +150,8 @@ done:
 pid_t
 dup_proc()
 {
-    // FIXME need investigate: issue with fork, as well as pthread
-    //       especially when involving frequent alloc and dealloc ops
-    //       (could be issue in allocator's segregated free list)
+    no_preemption();
+    
     struct proc_info* pcb = alloc_process();
     if (!pcb) {
         syscall_result(ENOMEM);
@@ -173,6 +173,7 @@ dup_proc()
     }
 
     __dup_fdtable(pcb);
+    uscope_copy(&pcb->uscope, current_user_scope());
 
     struct proc_mm* mm = vmspace(pcb);
     procvm_dupvms_mount(mm);