Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 31 Jul 2017 17:57:55 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r321803 - head/sys/x86/x86
Message-ID:  <201707311757.v6VHvtlP061352@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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"));



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201707311757.v6VHvtlP061352>