Author: markj
Date: Mon Jul 31 17:57:54 2017
New Revision: 321803
URL: https://svnweb.freebsd.org/changeset/base/321803

Log:
  Don't trace running threads that have interrupts disabled.
  
  In this case we shouldn't assume that the thread has a valid frame pointer.
  
  Reviewed by:  kib
  MFC after:    1 week
  Differential Revision:        https://reviews.freebsd.org/D11787

Modified:
  head/sys/x86/x86/stack_machdep.c

Modified: head/sys/x86/x86/stack_machdep.c
==============================================================================
--- head/sys/x86/x86/stack_machdep.c    Mon Jul 31 17:57:44 2017        
(r321802)
+++ head/sys/x86/x86/stack_machdep.c    Mon Jul 31 17:57:54 2017        
(r321803)
@@ -49,12 +49,14 @@ __FBSDID("$FreeBSD$");
 
 #ifdef __i386__
 #define        PCB_FP(pcb)     ((pcb)->pcb_ebp)
+#define        TF_FLAGS(tf)    ((tf)->tf_eflags)
 #define        TF_FP(tf)       ((tf)->tf_ebp)
 #define        TF_PC(tf)       ((tf)->tf_eip)
 
 typedef struct i386_frame *x86_frame_t;
 #else
 #define        PCB_FP(pcb)     ((pcb)->pcb_rbp)
+#define        TF_FLAGS(tf)    ((tf)->tf_rflags)
 #define        TF_FP(tf)       ((tf)->tf_rbp)
 #define        TF_PC(tf)       ((tf)->tf_rip)
 
@@ -104,10 +106,10 @@ stack_nmi_handler(struct trapframe *tf)
        if (nmi_stack == NULL || curthread != nmi_pending)
                return (0);
 
-       if (INKERNEL(TF_PC(tf)))
+       if (INKERNEL(TF_PC(tf)) && (TF_FLAGS(tf) & PSL_I) != 0)
                stack_capture(curthread, nmi_stack, TF_FP(tf));
        else
-               /* We interrupted a thread in user mode. */
+               /* We were running in usermode or had interrupts disabled. */
                nmi_stack->depth = 0;
 
        atomic_store_rel_ptr((long *)&nmi_pending, (long)NULL);
@@ -155,7 +157,6 @@ stack_save_td_running(struct stack *st, struct thread 
        mtx_unlock_spin(&nmi_lock);
 
        if (st->depth == 0)
-               /* We interrupted a thread in user mode. */
                return (EAGAIN);
 #else /* !SMP */
        KASSERT(0, ("curthread isn't running"));
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to