PCI device locking and synchronization
[akaros.git] / kern / arch / x86 / trap32.c
index dbc9140..0ffa700 100644 (file)
@@ -63,7 +63,7 @@ void print_trapframe(struct hw_trapframe *hw_tf)
        /* This is only called in debug scenarios, and often when the kernel trapped
         * and needs to tell us about it.  Disable the lock checker so it doesn't go
         * nuts when we print/panic */
-       pcpui->__lock_depth_disabled++;
+       pcpui->__lock_checking_enabled--;
        spin_lock_irqsave(&ptf_lock);
        printk("TRAP frame at %p on core %d\n", hw_tf, core_id());
        print_regs(&hw_tf->tf_regs);
@@ -83,45 +83,16 @@ void print_trapframe(struct hw_trapframe *hw_tf)
                printk("  ss   0x----%04x\n", hw_tf->tf_ss);
        }
        spin_unlock_irqsave(&ptf_lock);
-       pcpui->__lock_depth_disabled--;
+       pcpui->__lock_checking_enabled++;
 }
 
-void page_fault_handler(struct hw_trapframe *hw_tf)
+void __arch_reflect_trap_hwtf(struct hw_trapframe *hw_tf, unsigned int trap_nr,
+                              unsigned int err, unsigned long aux)
 {
-       uint32_t fault_va = rcr2();
-       int prot = hw_tf->tf_err & PF_ERROR_WRITE ? PROT_WRITE : PROT_READ;
-       int err;
-
-       /* TODO - handle kernel page faults */
-       if ((hw_tf->tf_cs & 3) == 0) {
-               print_trapframe(hw_tf);
-               panic("Page Fault in the Kernel at 0x%08x!", fault_va);
-               /* if we want to do something like kill a process or other code, be
-                * aware we are in a sort of irq-like context, meaning the main kernel
-                * code we 'interrupted' could be holding locks - even irqsave locks. */
-       }
-       /* safe to reenable after rcr2 */
-       enable_irq();
-       if ((err = handle_page_fault(current, fault_va, prot))) {
-               /* Destroy the faulting process */
-               printk("[%08x] user %s fault va %08x ip %08x on core %d with err %d\n",
-                      current->pid, prot & PROT_READ ? "READ" : "WRITE", fault_va,
-                      hw_tf->tf_eip, core_id(), err);
-               print_trapframe(hw_tf);
-               /* Turn this on to help debug bad function pointers */
-               printd("esp %p\n\t 0(esp): %p\n\t 4(esp): %p\n\t 8(esp): %p\n"
-                      "\t12(esp): %p\n", hw_tf->tf_esp,
-                      *(uintptr_t*)(hw_tf->tf_esp +  0),
-                      *(uintptr_t*)(hw_tf->tf_esp +  4),
-                      *(uintptr_t*)(hw_tf->tf_esp +  8),
-                      *(uintptr_t*)(hw_tf->tf_esp + 12));
-               proc_destroy(current);
-       }
-}
-
-void sysenter_init(void)
-{
-       write_msr(MSR_IA32_SYSENTER_CS, GD_KT);
-       write_msr(MSR_IA32_SYSENTER_ESP, ts.ts_esp0);
-       write_msr(MSR_IA32_SYSENTER_EIP, (uint32_t) &sysenter_handler);
+       hw_tf->tf_trapno = trap_nr;
+       /* this can be necessary, since hw_tf is the pcpui one, and the err that
+        * came in probably came from the kernel stack's hw_tf. */
+       hw_tf->tf_err = err;
+       hw_tf->tf_regs.reg_oesp = aux;
+       hw_tf->tf_padding3 = ROS_ARCH_REFL_ID;
 }