feat: (ahci) support multiple AHCI controller
[lunaix-os.git] / lunaix-os / kernel / asm / x86 / pfault.c
index 30fd498605d721f9c3d782210a37b186b4fa7ce9..fcd52cc26480058f3a83b2144e8b46ee0b2c949a 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)
         ;
@@ -106,14 +108,8 @@ int
 do_kernel(v_mapping* mapping)
 {
     uintptr_t addr = mapping->va;
-    if (addr >= KHEAP_START && addr < PROC_START) {
-        // This is kernel heap page
-        uintptr_t pa = pmm_alloc_page(KERNEL_PID, 0);
-        *mapping->pte = (*mapping->pte & 0xfff) | pa | PG_PRESENT;
-        cpu_invplg(mapping->pte);
-        cpu_invplg(addr);
-        goto done;
-    }
+
+    // TODO
 
     return 0;
 done: