x86: disables lock debugging when handling PFs
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 29 May 2014 17:11:37 +0000 (10:11 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 29 May 2014 17:14:59 +0000 (10:14 -0700)
Needs some work.  It's only necessary right now for kernel page faults,
not user ones, since user page faults don't increment the kernel trap
depth.

RISCV may need to do something similar.

kern/arch/x86/trap.c

index bf5bd35..d86f15c 100644 (file)
@@ -239,12 +239,13 @@ static bool __handle_page_fault(struct hw_trapframe *hw_tf, unsigned long *aux)
 {
        uintptr_t fault_va = rcr2();
        int prot = hw_tf->tf_err & PF_ERROR_WRITE ? PROT_WRITE : PROT_READ;
+       struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
        int err;
 
        /* safe to reenable after rcr2 */
        enable_irq();
 
-       if (!current) {
+       if (!pcpui->cur_proc) {
                /* still catch KPFs */
                assert((hw_tf->tf_cs & 3) == 0);
                print_trapframe(hw_tf);
@@ -252,11 +253,19 @@ static bool __handle_page_fault(struct hw_trapframe *hw_tf, unsigned long *aux)
                panic("Proc-less Page Fault in the Kernel at %p!", fault_va);
        }
        /* TODO - handle kernel page faults.  This is dangerous, since we might be
-        * holding locks in the kernel and could deadlock when we HPF.
+        * holding locks in the kernel and could deadlock when we HPF.  For now, I'm
+        * just disabling the lock checker, since it'll flip out when it sees there
+        * is a kernel trap.  Will need to think about this a bit, esp when we
+        * properly handle bad addrs and whatnot.
         *
         * Also consider turning on IRQs globally while we call HPF. */
-       if ((err = handle_page_fault(current, fault_va, prot))) {
-               if ((hw_tf->tf_cs & 3) == 0) {
+       if (in_kernel(hw_tf))
+               pcpui->__lock_checking_enabled--;
+       err = handle_page_fault(pcpui->cur_proc, fault_va, prot);
+       if (in_kernel(hw_tf))
+               pcpui->__lock_checking_enabled++;
+       if (err) {
+               if (in_kernel(hw_tf)) {
                        print_trapframe(hw_tf);
                        backtrace_kframe(hw_tf);
                        panic("Proc-ful Page Fault in the Kernel at %p!", fault_va);