Page MenuHomeFreeBSD

D15054.diff
No OneTemporary

D15054.diff

Index: head/sys/amd64/amd64/machdep.c
===================================================================
--- head/sys/amd64/amd64/machdep.c
+++ head/sys/amd64/amd64/machdep.c
@@ -1978,7 +1978,12 @@
int
ptrace_single_step(struct thread *td)
{
- td->td_frame->tf_rflags |= PSL_T;
+
+ PROC_LOCK_ASSERT(td->td_proc, MA_OWNED);
+ if ((td->td_frame->tf_rflags & PSL_T) == 0) {
+ td->td_frame->tf_rflags |= PSL_T;
+ td->td_dbgflags |= TDB_STEP;
+ }
return (0);
}
@@ -1986,7 +1991,9 @@
ptrace_clear_single_step(struct thread *td)
{
+ PROC_LOCK_ASSERT(td->td_proc, MA_OWNED);
td->td_frame->tf_rflags &= ~PSL_T;
+ td->td_dbgflags &= ~TDB_STEP;
return (0);
}
Index: head/sys/amd64/amd64/trap.c
===================================================================
--- head/sys/amd64/amd64/trap.c
+++ head/sys/amd64/amd64/trap.c
@@ -285,8 +285,14 @@
signo = SIGTRAP;
ucode = TRAP_TRACE;
dr6 = rdr6();
- if (dr6 & DBREG_DR6_BS)
- frame->tf_rflags &= ~PSL_T;
+ if ((dr6 & DBREG_DR6_BS) != 0) {
+ PROC_LOCK(td->td_proc);
+ if ((td->td_dbgflags & TDB_STEP) != 0) {
+ td->td_frame->tf_rflags &= ~PSL_T;
+ td->td_dbgflags &= ~TDB_STEP;
+ }
+ PROC_UNLOCK(td->td_proc);
+ }
break;
case T_ARITHTRAP: /* arithmetic trap */
Index: head/sys/i386/i386/machdep.c
===================================================================
--- head/sys/i386/i386/machdep.c
+++ head/sys/i386/i386/machdep.c
@@ -2764,7 +2764,12 @@
int
ptrace_single_step(struct thread *td)
{
- td->td_frame->tf_eflags |= PSL_T;
+
+ PROC_LOCK_ASSERT(td->td_proc, MA_OWNED);
+ if ((td->td_frame->tf_eflags & PSL_T) == 0) {
+ td->td_frame->tf_eflags |= PSL_T;
+ td->td_dbgflags |= TDB_STEP;
+ }
return (0);
}
@@ -2772,7 +2777,9 @@
ptrace_clear_single_step(struct thread *td)
{
+ PROC_LOCK_ASSERT(td->td_proc, MA_OWNED);
td->td_frame->tf_eflags &= ~PSL_T;
+ td->td_dbgflags &= ~TDB_STEP;
return (0);
}
Index: head/sys/i386/i386/trap.c
===================================================================
--- head/sys/i386/i386/trap.c
+++ head/sys/i386/i386/trap.c
@@ -337,8 +337,14 @@
signo = SIGTRAP;
ucode = TRAP_TRACE;
dr6 = rdr6();
- if (dr6 & DBREG_DR6_BS)
- frame->tf_eflags &= ~PSL_T;
+ if ((dr6 & DBREG_DR6_BS) != 0) {
+ PROC_LOCK(td->td_proc);
+ if ((td->td_dbgflags & TDB_STEP) != 0) {
+ td->td_frame->tf_eflags &= ~PSL_T;
+ td->td_dbgflags &= ~TDB_STEP;
+ }
+ PROC_UNLOCK(td->td_proc);
+ }
break;
case T_ARITHTRAP: /* arithmetic trap */
Index: head/sys/sys/proc.h
===================================================================
--- head/sys/sys/proc.h
+++ head/sys/sys/proc.h
@@ -465,6 +465,7 @@
#define TDB_EXIT 0x00000400 /* Exiting LWP indicator for ptrace() */
#define TDB_VFORK 0x00000800 /* vfork indicator for ptrace() */
#define TDB_FSTP 0x00001000 /* The thread is PT_ATTACH leader */
+#define TDB_STEP 0x00002000 /* (x86) PSL_T set for PT_STEP */
/*
* "Private" flags kept in td_pflags:

File Metadata

Mime Type
text/plain
Expires
Tue, Jan 28, 8:37 AM (5 h, 36 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16263404
Default Alt Text
D15054.diff (2 KB)

Event Timeline