Page MenuHomeFreeBSD

D11787.diff
No OneTemporary

D11787.diff

Index: head/sys/x86/x86/stack_machdep.c
===================================================================
--- head/sys/x86/x86/stack_machdep.c
+++ head/sys/x86/x86/stack_machdep.c
@@ -49,12 +49,14 @@
#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 @@
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 @@
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"));

File Metadata

Mime Type
text/plain
Expires
Wed, Aug 5, 3:51 AM (9 h, 20 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
35990987
Default Alt Text
D11787.diff (1 KB)

Event Timeline