#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>
tlb_flush_vmr_all(region);
}
-static inline void
-__dup_fdtable(struct proc_info* pcb)
-{
- for (size_t i = 0; i < VFS_MAX_FD; i++) {
- struct v_fd* fd = __current->fdtable->fds[i];
- if (!fd)
- continue;
- vfs_dup_fd(fd, &pcb->fdtable->fds[i]);
- }
-}
-
-
static void
__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)) {
return NULL;
}
- th->intr_ctx = current_thread->intr_ctx;
+ th->hstate = current_thread->hstate;
th->kstack = current_thread->kstack;
signal_dup_context(&th->sigctx);
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);
vfs_ref_dnode(pcb->cwd);
}
- __dup_fdtable(pcb);
+ fdtable_copy(pcb->fdtable, __current->fdtable);
+ uscope_copy(&pcb->uscope, current_user_scope());
struct proc_mm* mm = vmspace(pcb);
procvm_dupvms_mount(mm);