PERFORCE change 56172 for review
David Xu
davidxu at FreeBSD.org
Wed Jun 30 16:05:49 PDT 2004
http://perforce.freebsd.org/chv.cgi?CH=56172
Change 56172 by davidxu at davidxu_alona on 2004/06/30 23:04:22
Let ptrace deal with lwpid as pid. remove ttrace.
Affected files ...
.. //depot/projects/davidxu_ksedbg/src/sys/kern/init_sysent.c#3 edit
.. //depot/projects/davidxu_ksedbg/src/sys/kern/sys_process.c#3 edit
.. //depot/projects/davidxu_ksedbg/src/sys/kern/syscalls.c#3 edit
.. //depot/projects/davidxu_ksedbg/src/sys/kern/syscalls.master#3 edit
.. //depot/projects/davidxu_ksedbg/src/sys/sys/signalvar.h#2 edit
.. //depot/projects/davidxu_ksedbg/src/sys/sys/syscall.h#3 edit
.. //depot/projects/davidxu_ksedbg/src/sys/sys/syscall.mk#3 edit
.. //depot/projects/davidxu_ksedbg/src/sys/sys/sysproto.h#3 edit
Differences ...
==== //depot/projects/davidxu_ksedbg/src/sys/kern/init_sysent.c#3 (text+ko) ====
@@ -472,5 +472,4 @@
{ SYF_MPSAFE | AS(ksem_timedwait_args), (sy_call_t *)lkmressys }, /* 441 = ksem_timedwait */
{ SYF_MPSAFE | AS(thr_suspend_args), (sy_call_t *)thr_suspend }, /* 442 = thr_suspend */
{ SYF_MPSAFE | AS(thr_wake_args), (sy_call_t *)thr_wake }, /* 443 = thr_wake */
- { AS(ttrace_args), (sy_call_t *)ttrace }, /* 444 = ttrace */
};
==== //depot/projects/davidxu_ksedbg/src/sys/kern/sys_process.c#3 (text+ko) ====
@@ -55,9 +55,6 @@
#include <vm/vm_object.h>
#include <vm/vm_page.h>
-static int kern_ttrace(struct thread *td, int req, pid_t pid, lwpid_t tid,
- void *addr, int data);
-
/*
* Functions implemented using PROC_ACTION():
*
@@ -363,97 +360,17 @@
return (error);
}
-#ifndef _SYS_SYSPROTO_H_
-struct ttrace_args {
- int req;
- pid_t pid;
- lwpid_t tid;
- caddr_t addr;
- int data;
-};
-#endif
-
-int
-ttrace(struct thread *td, struct ttrace_args * uap)
-{
- /*
- * XXX this obfuscation is to reduce stack usage, but the register
- * structs may be too large to put on the stack anyway.
- */
- union {
- struct ptrace_io_desc piod;
- struct dbreg dbreg;
- struct fpreg fpreg;
- struct reg reg;
- } r;
- void *addr;
- int error = 0;
-
- addr = &r;
- switch (uap->req) {
- case PT_GETREGS:
- case PT_GETFPREGS:
- case PT_GETDBREGS:
- break;
- case PT_SETREGS:
- error = copyin(uap->addr, &r.reg, sizeof r.reg);
- break;
- case PT_SETFPREGS:
- error = copyin(uap->addr, &r.fpreg, sizeof r.fpreg);
- break;
- case PT_SETDBREGS:
- error = copyin(uap->addr, &r.dbreg, sizeof r.dbreg);
- break;
- case PT_IO:
- error = copyin(uap->addr, &r.piod, sizeof r.piod);
- break;
- default:
- addr = uap->addr;
- break;
- }
- if (error)
- return (error);
-
- error = kern_ttrace(td, uap->req, uap->pid, uap->tid, addr, uap->data);
- if (error)
- return (error);
-
- switch (uap->req) {
- case PT_IO:
- (void)copyout(&r.piod, uap->addr, sizeof r.piod);
- break;
- case PT_GETREGS:
- error = copyout(&r.reg, uap->addr, sizeof r.reg);
- break;
- case PT_GETFPREGS:
- error = copyout(&r.fpreg, uap->addr, sizeof r.fpreg);
- break;
- case PT_GETDBREGS:
- error = copyout(&r.dbreg, uap->addr, sizeof r.dbreg);
- break;
- }
-
- return (error);
-}
-
int
kern_ptrace(struct thread *td, int req, pid_t pid, void *addr, int data)
{
- return kern_ttrace(td, req, pid, 0, addr, data);
-}
-
-int
-kern_ttrace(struct thread *td, int req, pid_t pid, lwpid_t tid, void *addr,
- int data)
-{
struct iovec iov;
struct uio uio;
struct proc *curp, *p, *pp;
- struct thread *td2;
struct ptrace_io_desc *piod;
int error, write, tmp, num;
int proctree_locked = 0;
- lwpid_t *buf, tid2;
+ struct thread *td2 = NULL;
+ lwpid_t tid = 0, tid2, *buf;
curp = td->td_proc;
@@ -478,10 +395,35 @@
p = td->td_proc;
PROC_LOCK(p);
} else {
- if ((p = pfind(pid)) == NULL) {
- if (proctree_locked)
- sx_xunlock(&proctree_lock);
- return (ESRCH);
+ if (pid <= PID_MAX) {
+ if ((p = pfind(pid)) == NULL) {
+ if (proctree_locked)
+ sx_xunlock(&proctree_lock);
+ return (ESRCH);
+ }
+ } else {
+ /* this is slow, should be optimized */
+ sx_slock(&allproc_lock);
+ FOREACH_PROC_IN_SYSTEM(p) {
+ PROC_LOCK(p);
+ mtx_lock_spin(&sched_lock);
+ FOREACH_THREAD_IN_PROC(p, td2) {
+ if (td2->td_tid == pid)
+ break;
+ }
+ mtx_unlock_spin(&sched_lock);
+ if (td2 != NULL)
+ break; /* proc lock held */
+ PROC_UNLOCK(p);
+ }
+ sx_sunlock(&allproc_lock);
+ if (p == NULL) {
+ if (proctree_locked)
+ sx_xunlock(&proctree_lock);
+ return (ESRCH);
+ }
+ tid = pid;
+ pid = p->p_pid;
}
}
if ((error = p_cansee(td, p)) != 0)
@@ -498,6 +440,11 @@
goto fail;
}
+ if (tid == 0) {
+ td2 = FIRST_THREAD_IN_PROC(p);
+ tid = td2->td_tid;
+ }
+
/*
* Permissions check
*/
@@ -563,19 +510,6 @@
break;
}
- if (tid == 0)
- td2 = FIRST_THREAD_IN_PROC(p);
- else {
- FOREACH_THREAD_IN_PROC(p, td2) {
- if (td2->td_tid == tid)
- break;
- }
- if (td2 == NULL) {
- error = ESRCH;
- goto fail;
- }
- }
-
#ifdef FIX_SSTEP
/*
* Single step fixup ala procfs
==== //depot/projects/davidxu_ksedbg/src/sys/kern/syscalls.c#3 (text+ko) ====
@@ -451,5 +451,4 @@
"ksem_timedwait", /* 441 = ksem_timedwait */
"thr_suspend", /* 442 = thr_suspend */
"thr_wake", /* 443 = thr_wake */
- "ttrace", /* 444 = ttrace */
};
==== //depot/projects/davidxu_ksedbg/src/sys/kern/syscalls.master#3 (text+ko) ====
@@ -631,7 +631,5 @@
441 MNOSTD { int ksem_timedwait(semid_t id, struct timespec *abstime); }
442 MSTD { int thr_suspend(const struct timespec *timeout); }
443 MSTD { int thr_wake(thr_id_t id); }
-444 STD { int ttrace(int req, pid_t pid, lwpid_t tid, \
- caddr_t addr, int data); }
; Please copy any additions and changes to the following compatability tables:
; sys/compat/freebsd32/syscalls.master
==== //depot/projects/davidxu_ksedbg/src/sys/sys/signalvar.h#2 (text+ko) ====
@@ -271,7 +271,7 @@
void signotify(struct thread *td);
void tdsignal(struct thread *td, int sig, sigtarget_t target);
void trapsignal(struct thread *td, int sig, u_long code);
-void ptracestop(struct thread *td, int sig);
+int ptracestop(struct thread *td, int sig);
/*
* Machine-dependent functions:
==== //depot/projects/davidxu_ksedbg/src/sys/sys/syscall.h#3 (text+ko) ====
@@ -356,5 +356,4 @@
#define SYS_ksem_timedwait 441
#define SYS_thr_suspend 442
#define SYS_thr_wake 443
-#define SYS_ttrace 444
-#define SYS_MAXSYSCALL 445
+#define SYS_MAXSYSCALL 444
==== //depot/projects/davidxu_ksedbg/src/sys/sys/syscall.mk#3 (text+ko) ====
@@ -297,5 +297,4 @@
kse_switchin.o \
ksem_timedwait.o \
thr_suspend.o \
- thr_wake.o \
- ttrace.o
+ thr_wake.o
==== //depot/projects/davidxu_ksedbg/src/sys/sys/sysproto.h#3 (text+ko) ====
@@ -1302,13 +1302,6 @@
struct thr_wake_args {
char id_l_[PADL_(thr_id_t)]; thr_id_t id; char id_r_[PADR_(thr_id_t)];
};
-struct ttrace_args {
- char req_l_[PADL_(int)]; int req; char req_r_[PADR_(int)];
- char pid_l_[PADL_(pid_t)]; pid_t pid; char pid_r_[PADR_(pid_t)];
- char tid_l_[PADL_(lwpid_t)]; lwpid_t tid; char tid_r_[PADR_(lwpid_t)];
- char addr_l_[PADL_(caddr_t)]; caddr_t addr; char addr_r_[PADR_(caddr_t)];
- char data_l_[PADL_(int)]; int data; char data_r_[PADR_(int)];
-};
int nosys(struct thread *, struct nosys_args *);
void sys_exit(struct thread *, struct sys_exit_args *);
int fork(struct thread *, struct fork_args *);
@@ -1603,7 +1596,6 @@
int ksem_timedwait(struct thread *, struct ksem_timedwait_args *);
int thr_suspend(struct thread *, struct thr_suspend_args *);
int thr_wake(struct thread *, struct thr_wake_args *);
-int ttrace(struct thread *, struct ttrace_args *);
#ifdef COMPAT_43
More information about the p4-projects
mailing list