diff options
author | John Baldwin <jhb@FreeBSD.org> | 2015-09-01 22:24:54 +0000 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2015-09-01 22:24:54 +0000 |
commit | 183b68f74f05cf7d66ab344857cd25e4c00513b2 (patch) | |
tree | 7d48ab783270ef6dbf8fe7948572ad12b96d274c | |
parent | 45d4c036ec4a6dc57b6666d49cd6a2f48976c7a5 (diff) |
Notes
-rw-r--r-- | sys/kern/subr_syscall.c | 6 | ||||
-rw-r--r-- | sys/kern/sys_process.c | 11 | ||||
-rw-r--r-- | sys/sys/proc.h | 4 | ||||
-rw-r--r-- | sys/sys/ptrace.h | 2 |
4 files changed, 22 insertions, 1 deletions
diff --git a/sys/kern/subr_syscall.c b/sys/kern/subr_syscall.c index 070ba281cbaf..292b942d4d94 100644 --- a/sys/kern/subr_syscall.c +++ b/sys/kern/subr_syscall.c @@ -85,6 +85,8 @@ syscallenter(struct thread *td, struct syscall_args *sa) STOPEVENT(p, S_SCE, sa->narg); if (p->p_flag & P_TRACED && p->p_stops & S_PT_SCE) { PROC_LOCK(p); + td->td_dbg_sc_code = sa->code; + td->td_dbg_sc_narg = sa->narg; ptracestop((td), SIGTRAP); PROC_UNLOCK(p); } @@ -94,6 +96,10 @@ syscallenter(struct thread *td, struct syscall_args *sa) * debugger modified registers or memory. */ error = (p->p_sysent->sv_fetch_syscall_args)(td, sa); + PROC_LOCK(p); + td->td_dbg_sc_code = sa->code; + td->td_dbg_sc_narg = sa->narg; + PROC_UNLOCK(p); #ifdef KTRACE if (KTRPOINT(td, KTR_SYSCALL)) ktrsyscall(sa->code, sa->narg, sa->args); diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index 66109604ad57..eb50acda099d 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -97,6 +97,8 @@ struct ptrace_lwpinfo32 { struct siginfo32 pl_siginfo; /* siginfo for signal */ char pl_tdname[MAXCOMLEN + 1]; /* LWP name. */ int pl_child_pid; /* New child pid */ + u_int pl_syscall_code; + u_int pl_syscall_narg; }; #endif @@ -481,6 +483,8 @@ ptrace_lwpinfo_to32(const struct ptrace_lwpinfo *pl, siginfo_to_siginfo32(&pl->pl_siginfo, &pl32->pl_siginfo); strcpy(pl32->pl_tdname, pl->pl_tdname); pl32->pl_child_pid = pl->pl_child_pid; + pl32->pl_syscall_code = pl->pl_syscall_code; + pl32->pl_syscall_narg = pl->pl_syscall_narg; } #endif /* COMPAT_FREEBSD32 */ @@ -1211,6 +1215,13 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) pl->pl_sigmask = td2->td_sigmask; pl->pl_siglist = td2->td_siglist; strcpy(pl->pl_tdname, td2->td_name); + if ((td2->td_dbgflags & (TDB_SCE | TDB_SCX)) != 0) { + pl->pl_syscall_code = td2->td_dbg_sc_code; + pl->pl_syscall_narg = td2->td_dbg_sc_narg; + } else { + pl->pl_syscall_code = 0; + pl->pl_syscall_narg = 0; + } #ifdef COMPAT_FREEBSD32 if (wrap32) ptrace_lwpinfo_to32(pl, pl32); diff --git a/sys/sys/proc.h b/sys/sys/proc.h index 62c4b05c0061..ae01bbf119e8 100644 --- a/sys/sys/proc.h +++ b/sys/sys/proc.h @@ -174,6 +174,7 @@ struct procdesc; struct racct; struct sbuf; struct sleepqueue; +struct syscall_args; struct td_sched; struct thread; struct trapframe; @@ -282,6 +283,8 @@ struct thread { int td_no_sleeping; /* (k) Sleeping disabled count. */ int td_dom_rr_idx; /* (k) RR Numa domain selection. */ void *td_su; /* (k) FFS SU private */ + u_int td_dbg_sc_code; /* (c) Syscall code to debugger. */ + u_int td_dbg_sc_narg; /* (c) Syscall arg count to debugger.*/ #define td_endzero td_sigmask /* Copied during fork1() or create_thread(). */ @@ -979,7 +982,6 @@ void userret(struct thread *, struct trapframe *); void cpu_exit(struct thread *); void exit1(struct thread *, int, int) __dead2; -struct syscall_args; int cpu_fetch_syscall_args(struct thread *td, struct syscall_args *sa); void cpu_fork(struct thread *, struct proc *, struct thread *, int); void cpu_set_fork_handler(struct thread *, void (*)(void *), void *); diff --git a/sys/sys/ptrace.h b/sys/sys/ptrace.h index e770a0612eac..de4e7a7c1d4d 100644 --- a/sys/sys/ptrace.h +++ b/sys/sys/ptrace.h @@ -113,6 +113,8 @@ struct ptrace_lwpinfo { struct __siginfo pl_siginfo; /* siginfo for signal */ char pl_tdname[MAXCOMLEN + 1]; /* LWP name */ int pl_child_pid; /* New child pid */ + u_int pl_syscall_code; + u_int pl_syscall_narg; }; /* Argument structure for PT_VM_ENTRY. */ |