Merge branch 'master' of github.com:Minep/lunaix-os
[lunaix-os.git] / lunaix-os / kernel / asm / x86 / pfault.c
index 30fd498605d721f9c3d782210a37b186b4fa7ce9..6df3182622bce973794b360cb01cb91f5e138843 100644 (file)
@@ -1,5 +1,6 @@
 #include <arch/x86/interrupts.h>
 #include <lunaix/common.h>
+#include <lunaix/lxsignal.h>
 #include <lunaix/mm/mm.h>
 #include <lunaix/mm/pmm.h>
 #include <lunaix/mm/region.h>
@@ -40,17 +41,17 @@ intr_routine_page_fault(const isr_param* param)
         if (do_kernel(&mapping)) {
             return;
         }
-        goto segv_term;
+        // 如果不是,那么看看内核是不是需要用户页。
     }
 
     struct mm_region* hit_region = region_get(&__current->mm.regions, ptr);
 
     if (!hit_region) {
-        // Into the void...
+        // 当你凝视深渊时……
         goto segv_term;
     }
 
-    x86_pte_t* pte = &PTE_MOUNTED(PD_REFERENCED, ptr >> 12);
+    volatile x86_pte_t* pte = &PTE_MOUNTED(PD_REFERENCED, ptr >> 12);
     if ((*pte & PG_PRESENT)) {
         if ((hit_region->attr & COW_MASK) == COW_MASK) {
             // normal page fault, do COW
@@ -92,7 +93,8 @@ segv_term:
             ptr,
             param->cs,
             param->eip);
-    terminate_proc(LXSEGFAULT);
+    __SIGSET(__current->sig_pending, _SIGSEGV);
+    schedule();
     // should not reach
     while (1)
         ;