diff options
author | robert <robert@FreeBSD.org> | 2003-10-09 10:17:16 +0000 |
---|---|---|
committer | robert <robert@FreeBSD.org> | 2003-10-09 10:17:16 +0000 |
commit | 8519aa2ff041ebfe2fa21adb87df58dd07ab461a (patch) | |
tree | d286b80736e6c9743f984bcdfc12b33ff7eff197 /sys/kern/sys_process.c | |
parent | 20b1e12f1fef844ae5a2932fcacde82b2bd55ffa (diff) | |
download | FreeBSD-src-8519aa2ff041ebfe2fa21adb87df58dd07ab461a.zip FreeBSD-src-8519aa2ff041ebfe2fa21adb87df58dd07ab461a.tar.gz |
Implement preliminary support for the PT_SYSCALL command to ptrace(2).
Diffstat (limited to 'sys/kern/sys_process.c')
-rw-r--r-- | sys/kern/sys_process.c | 17 |
1 files changed, 16 insertions, 1 deletions
diff --git a/sys/kern/sys_process.c b/sys/kern/sys_process.c index 51bbdcd..9e49d9d 100644 --- a/sys/kern/sys_process.c +++ b/sys/kern/sys_process.c @@ -382,6 +382,8 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) case PT_ATTACH: case PT_STEP: case PT_CONTINUE: + case PT_TO_SCE: + case PT_TO_SCX: case PT_DETACH: sx_xlock(&proctree_lock); proctree_locked = 1; @@ -507,6 +509,8 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) case PT_STEP: case PT_CONTINUE: + case PT_TO_SCE: + case PT_TO_SCX: case PT_DETACH: /* Zero means do not send any signal */ if (data < 0 || data > _SIG_MAXSIG) { @@ -516,12 +520,23 @@ kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data) _PHOLD(p); - if (req == PT_STEP) { + switch (req) { + case PT_STEP: error = ptrace_single_step(td2); if (error) { _PRELE(p); goto fail; } + break; + case PT_TO_SCE: + p->p_stops |= S_PT_SCE; + break; + case PT_TO_SCX: + p->p_stops |= S_PT_SCX; + break; + case PT_SYSCALL: + p->p_stops |= S_PT_SCE | S_PT_SCX; + break; } if (addr != (void *)1) { |