summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarkj <markj@FreeBSD.org>2017-08-07 17:30:22 +0000
committermarkj <markj@FreeBSD.org>2017-08-07 17:30:22 +0000
commitdc13a288927617f3d7e81f8c28b0a6c0b6dfba5e (patch)
tree1dcfd5b3548947391645bfe1141ee8f8bbdfd04d
parentccc8553ab8f73d34ab1f22b3c5a38f61ecb925b2 (diff)
downloadFreeBSD-src-dc13a288927617f3d7e81f8c28b0a6c0b6dfba5e.zip
FreeBSD-src-dc13a288927617f3d7e81f8c28b0a6c0b6dfba5e.tar.gz
MFC r321803:
Don't trace running threads that have interrupts disabled.
-rw-r--r--sys/x86/x86/stack_machdep.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/sys/x86/x86/stack_machdep.c b/sys/x86/x86/stack_machdep.c
index c2adbb0..8f6ed0d 100644
--- a/sys/x86/x86/stack_machdep.c
+++ b/sys/x86/x86/stack_machdep.c
@@ -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 *td)
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"));
OpenPOWER on IntegriCloud