svn commit: r321803 - head/sys/x86/x86
Mark Johnston
markj at FreeBSD.org
Mon Jul 31 17:57:56 UTC 2017
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"));
More information about the svn-src-head
mailing list