refactor: one more step towards arch-agnostic design
[lunaix-os.git] / lunaix-os / kernel / process / process.c
index 533c577436b0c2d448a7e85f8d8d62a0c44ef954..2407ecf1c2709348ee8283ececc18d53a5abea7f 100644 (file)
@@ -1,4 +1,3 @@
-#include <arch/abi.h>
 #include <klibc/string.h>
 #include <lunaix/clock.h>
 #include <lunaix/common.h>
 #include <klibc/string.h>
 #include <lunaix/clock.h>
 #include <lunaix/common.h>
@@ -13,6 +12,9 @@
 #include <lunaix/syscall.h>
 #include <lunaix/syslog.h>
 
 #include <lunaix/syscall.h>
 #include <lunaix/syslog.h>
 
+#include <sys/abi.h>
+#include <sys/mm/mempart.h>
+
 LOG_MODULE("PROC")
 
 ptr_t
 LOG_MODULE("PROC")
 
 ptr_t
@@ -24,7 +26,7 @@ __dup_pagetable(pid_t pid, ptr_t mount_point)
     x86_page_table* ptd = (x86_page_table*)PG_MOUNT_1;
     x86_page_table* pptd = (x86_page_table*)(mount_point | (0x3FF << 12));
 
     x86_page_table* ptd = (x86_page_table*)PG_MOUNT_1;
     x86_page_table* pptd = (x86_page_table*)(mount_point | (0x3FF << 12));
 
-    size_t kspace_l1inx = L1_INDEX(KERNEL_MM_BASE);
+    size_t kspace_l1inx = L1_INDEX(KERNEL_EXEC);
 
     for (size_t i = 0; i < PG_MAX_ENTRIES - 1; i++) {
 
 
     for (size_t i = 0; i < PG_MAX_ENTRIES - 1; i++) {
 
@@ -63,7 +65,7 @@ __del_pagetable(pid_t pid, ptr_t mount_point)
     x86_page_table* pptd = (x86_page_table*)(mount_point | (0x3FF << 12));
 
     // only remove user address space
     x86_page_table* pptd = (x86_page_table*)(mount_point | (0x3FF << 12));
 
     // only remove user address space
-    for (size_t i = 0; i < L1_INDEX(KERNEL_MM_BASE); i++) {
+    for (size_t i = 0; i < L1_INDEX(KERNEL_EXEC); i++) {
         x86_pte_t ptde = pptd->entry[i];
         if (!ptde || !(ptde & PG_PRESENT)) {
             continue;
         x86_pte_t ptde = pptd->entry[i];
         if (!ptde || !(ptde & PG_PRESENT)) {
             continue;
@@ -177,12 +179,12 @@ __mark_region(ptr_t start_vpn, ptr_t end_vpn, int attr)
         x86_pte_t* curproc = &PTE_MOUNTED(VMS_SELF, i);
         x86_pte_t* newproc = &PTE_MOUNTED(VMS_MOUNT_1, i);
 
         x86_pte_t* curproc = &PTE_MOUNTED(VMS_SELF, i);
         x86_pte_t* newproc = &PTE_MOUNTED(VMS_MOUNT_1, i);
 
-        cpu_invplg((ptr_t)newproc);
+        cpu_flush_page((ptr_t)newproc);
 
         if ((attr & REGION_MODE_MASK) == REGION_RSHARED) {
             // 如果读共享,则将两者的都标注为只读,那么任何写入都将会应用COW策略。
 
         if ((attr & REGION_MODE_MASK) == REGION_RSHARED) {
             // 如果读共享,则将两者的都标注为只读,那么任何写入都将会应用COW策略。
-            cpu_invplg((ptr_t)curproc);
-            cpu_invplg((ptr_t)(i << 12));
+            cpu_flush_page((ptr_t)curproc);
+            cpu_flush_page((ptr_t)(i << 12));
 
             *curproc = *curproc & ~PG_WRITE;
             *newproc = *newproc & ~PG_WRITE;
 
             *curproc = *curproc & ~PG_WRITE;
             *newproc = *newproc & ~PG_WRITE;
@@ -211,8 +213,6 @@ dup_proc()
     pcb->intr_ctx = __current->intr_ctx;
     pcb->parent = __current;
 
     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);
     if (__current->cwd) {
         pcb->cwd = __current->cwd;
         vfs_ref_dnode(pcb->cwd);
@@ -221,7 +221,13 @@ dup_proc()
     __copy_fdtable(pcb);
     region_copy(&__current->mm, &pcb->mm);
 
     __copy_fdtable(pcb);
     region_copy(&__current->mm, &pcb->mm);
 
-    setup_proc_mem(pcb, VMS_SELF);
+    /*
+     *  store the return value for forked process.
+     *  this will be implicit carried over after kernel stack is copied.
+     */
+    store_retval(0);
+
+    copy_kernel_stack(pcb, VMS_SELF);
 
     // 根据 mm_region 进一步配置页表
 
 
     // 根据 mm_region 进一步配置页表
 
@@ -240,18 +246,15 @@ dup_proc()
 
     vmm_unmount_pd(VMS_MOUNT_1);
 
 
     vmm_unmount_pd(VMS_MOUNT_1);
 
-    // 正如同fork,返回两次。
-    store_retval_to(pcb, 0);
-
     commit_process(pcb);
 
     return pcb->pid;
 }
 
     commit_process(pcb);
 
     return pcb->pid;
 }
 
-extern void __kernel_end;
+extern void __kexec_end;
 
 void
 
 void
-setup_proc_mem(struct proc_info* proc, ptr_t usedMnt)
+copy_kernel_stack(struct proc_info* proc, ptr_t usedMnt)
 {
     // copy the entire kernel page table
     pid_t pid = proc->pid;
 {
     // copy the entire kernel page table
     pid_t pid = proc->pid;
@@ -271,7 +274,7 @@ setup_proc_mem(struct proc_info* proc, ptr_t usedMnt)
             In the name of Celestia our glorious goddess, I will fucking HATE
            the TLB for the rest of my LIFE!
         */
             In the name of Celestia our glorious goddess, I will fucking HATE
            the TLB for the rest of my LIFE!
         */
-        cpu_invplg((ptr_t)ppte);
+        cpu_flush_page((ptr_t)ppte);
 
         x86_pte_t p = *ppte;
         ptr_t ppa = vmm_dup_page(pid, PG_ENTRY_ADDR(p));
 
         x86_pte_t p = *ppte;
         ptr_t ppa = vmm_dup_page(pid, PG_ENTRY_ADDR(p));
@@ -279,9 +282,5 @@ setup_proc_mem(struct proc_info* proc, ptr_t usedMnt)
         *ppte = (p & 0xfff) | ppa;
     }
 
         *ppte = (p & 0xfff) | ppa;
     }
 
-    // 我们不需要分配内核的区域,因为所有的内核代码和数据段只能通过系统调用来访问,任何非法的访问
-    // 都会导致eip落在区域外面,从而segmentation fault.
-
-    // 至于其他的区域我们暂时没有办法知道,因为那需要知道用户程序的信息。我们留到之后在处理。
     proc->page_table = pt_copy;
 }
\ No newline at end of file
     proc->page_table = pt_copy;
 }
\ No newline at end of file