svn commit: r193789 - in stable/7: lib/libthr lib/libthread_db lib/libthread_db/arch/amd64 lib/libthread_db/arch/arm lib/libthread_db/arch/i386 lib/libthread_db/arch/ia64 lib/libthread_db/arch/powe...

Dag-Erling Smorgrav des at FreeBSD.org
Tue Jun 9 00:47:56 UTC 2009


Author: des
Date: Tue Jun  9 00:47:54 2009
New Revision: 193789
URL: http://svn.freebsd.org/changeset/base/193789

Log:
  merge r180982,r181044,r181059,r181065,r181341,r183021: WARNS cleanup,
  add thr_pread_{int,long,ptr} and thr_pwrite_{int,long,ptr}, and change
  definition of psaddr_t (no impact on ABI).  Discussed with marcel@, but
  any screwups are my own.

Modified:
  stable/7/lib/libthr/   (props changed)
  stable/7/lib/libthread_db/   (props changed)
  stable/7/lib/libthread_db/Makefile
  stable/7/lib/libthread_db/arch/amd64/libpthread_md.c
  stable/7/lib/libthread_db/arch/arm/libpthread_md.c
  stable/7/lib/libthread_db/arch/i386/libpthread_md.c
  stable/7/lib/libthread_db/arch/ia64/libpthread_md.c
  stable/7/lib/libthread_db/arch/powerpc/libpthread_md.c
  stable/7/lib/libthread_db/arch/sparc64/libpthread_md.c
  stable/7/lib/libthread_db/libpthread_db.c
  stable/7/lib/libthread_db/libpthread_db.h
  stable/7/lib/libthread_db/libthr_db.c
  stable/7/lib/libthread_db/thread_db.c
  stable/7/lib/libthread_db/thread_db.h
  stable/7/lib/libthread_db/thread_db_int.h
  stable/7/sys/   (props changed)
  stable/7/sys/contrib/pf/   (props changed)
  stable/7/sys/dev/ath/ath_hal/   (props changed)
  stable/7/sys/dev/cxgb/   (props changed)
  stable/7/sys/sys/procfs.h

Modified: stable/7/lib/libthread_db/Makefile
==============================================================================
--- stable/7/lib/libthread_db/Makefile	Tue Jun  9 00:27:23 2009	(r193788)
+++ stable/7/lib/libthread_db/Makefile	Tue Jun  9 00:47:54 2009	(r193789)
@@ -8,7 +8,7 @@ SRCS=	thread_db.c
 SRCS+=	libpthread_db.c libpthread_md.c
 SRCS+=	libthr_db.c
 INCS=	thread_db.h
-WARNS?= 1
+WARNS?= 6
 
 CFLAGS+=-I. -I${.CURDIR}
 SYM_MAPS+=${.CURDIR}/Symbol.map

Modified: stable/7/lib/libthread_db/arch/amd64/libpthread_md.c
==============================================================================
--- stable/7/lib/libthread_db/arch/amd64/libpthread_md.c	Tue Jun  9 00:27:23 2009	(r193788)
+++ stable/7/lib/libthread_db/arch/amd64/libpthread_md.c	Tue Jun  9 00:47:54 2009	(r193789)
@@ -30,8 +30,11 @@ __FBSDID("$FreeBSD$");
 
 #include <sys/procfs.h>
 #include <string.h>
+#include <thread_db.h>
 #include <ucontext.h>
 
+#include "libpthread_db.h"
+
 void
 pt_reg_to_ucontext(const struct reg *r, ucontext_t *uc)
 {

Modified: stable/7/lib/libthread_db/arch/arm/libpthread_md.c
==============================================================================
--- stable/7/lib/libthread_db/arch/arm/libpthread_md.c	Tue Jun  9 00:27:23 2009	(r193788)
+++ stable/7/lib/libthread_db/arch/arm/libpthread_md.c	Tue Jun  9 00:47:54 2009	(r193789)
@@ -27,9 +27,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
-#include <string.h>
 #include <sys/types.h>
-#include <proc_service.h>
+#include <string.h>
 #include <thread_db.h>
 
 #include "libpthread_db.h"
@@ -86,7 +85,7 @@ pt_ucontext_to_reg(const ucontext_t *uc,
 }
 
 void
-pt_fpreg_to_ucontext(const struct fpreg *r, ucontext_t *uc)
+pt_fpreg_to_ucontext(const struct fpreg *r __unused, ucontext_t *uc)
 {
 	mcontext_t *mc = &uc->uc_mcontext;
 
@@ -95,9 +94,8 @@ pt_fpreg_to_ucontext(const struct fpreg 
 }
 
 void
-pt_ucontext_to_fpreg(const ucontext_t *uc, struct fpreg *r)
+pt_ucontext_to_fpreg(const ucontext_t *uc __unused, struct fpreg *r)
 {
-	const mcontext_t *mc = &uc->uc_mcontext;
 
 	/* XXX */
 	memset(r, 0, sizeof(*r));
@@ -109,8 +107,9 @@ pt_md_init(void)
 }
 
 int
-pt_reg_sstep(struct reg *reg, int step)
+pt_reg_sstep(struct reg *reg __unused, int step __unused)
 {
 
 	/* XXX */
+	return (0);
 }

Modified: stable/7/lib/libthread_db/arch/i386/libpthread_md.c
==============================================================================
--- stable/7/lib/libthread_db/arch/i386/libpthread_md.c	Tue Jun  9 00:27:23 2009	(r193788)
+++ stable/7/lib/libthread_db/arch/i386/libpthread_md.c	Tue Jun  9 00:47:54 2009	(r193789)
@@ -27,11 +27,10 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
-#include <string.h>
 #include <sys/types.h>
-#include <proc_service.h>
-#include <thread_db.h>
 #include <machine/npx.h>
+#include <string.h>
+#include <thread_db.h>
 
 #include "libpthread_db.h"
 

Modified: stable/7/lib/libthread_db/arch/ia64/libpthread_md.c
==============================================================================
--- stable/7/lib/libthread_db/arch/ia64/libpthread_md.c	Tue Jun  9 00:27:23 2009	(r193788)
+++ stable/7/lib/libthread_db/arch/ia64/libpthread_md.c	Tue Jun  9 00:47:54 2009	(r193789)
@@ -28,25 +28,28 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/procfs.h>
+#include <thread_db.h>
 #include <ucontext.h>
 
+#include "libpthread_db.h"
+
 void
-pt_reg_to_ucontext(const struct reg *r, ucontext_t *uc)
+pt_reg_to_ucontext(const struct reg *r __unused, ucontext_t *uc __unused)
 {
 }
 
 void
-pt_ucontext_to_reg(const ucontext_t *uc, struct reg *r)
+pt_ucontext_to_reg(const ucontext_t *uc __unused, struct reg *r __unused)
 {
 }
 
 void
-pt_fpreg_to_ucontext(const struct fpreg* r, ucontext_t *uc)
+pt_fpreg_to_ucontext(const struct fpreg* r __unused, ucontext_t *uc __unused)
 {
 }
 
 void
-pt_ucontext_to_fpreg(const ucontext_t *uc, struct fpreg *r)
+pt_ucontext_to_fpreg(const ucontext_t *uc __unused, struct fpreg *r __unused)
 {
 }
 
@@ -56,7 +59,7 @@ pt_md_init(void)
 }
 
 int
-pt_reg_sstep(struct reg *reg, int step)
+pt_reg_sstep(struct reg *reg __unused, int step __unused)
 {
 	return (0);
 }

Modified: stable/7/lib/libthread_db/arch/powerpc/libpthread_md.c
==============================================================================
--- stable/7/lib/libthread_db/arch/powerpc/libpthread_md.c	Tue Jun  9 00:27:23 2009	(r193788)
+++ stable/7/lib/libthread_db/arch/powerpc/libpthread_md.c	Tue Jun  9 00:47:54 2009	(r193789)
@@ -27,9 +27,8 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
-#include <string.h>
 #include <sys/types.h>
-#include <proc_service.h>
+#include <string.h>
 #include <thread_db.h>
 
 #include "libpthread_db.h"
@@ -76,8 +75,9 @@ pt_md_init(void)
 }
 
 int
-pt_reg_sstep(struct reg *reg, int step)
+pt_reg_sstep(struct reg *reg __unused, int step __unused)
 {
 
 	/* XXX */
+	return (0);
 }

Modified: stable/7/lib/libthread_db/arch/sparc64/libpthread_md.c
==============================================================================
--- stable/7/lib/libthread_db/arch/sparc64/libpthread_md.c	Tue Jun  9 00:27:23 2009	(r193788)
+++ stable/7/lib/libthread_db/arch/sparc64/libpthread_md.c	Tue Jun  9 00:47:54 2009	(r193789)
@@ -28,25 +28,28 @@
 __FBSDID("$FreeBSD$");
 
 #include <sys/procfs.h>
+#include <thread_db.h>
 #include <ucontext.h>
 
+#include "libpthread_db.h"
+
 void
-pt_reg_to_ucontext(const struct reg *r, ucontext_t *uc)
+pt_reg_to_ucontext(const struct reg *r __unused, ucontext_t *uc __unused)
 {
 }
 
 void
-pt_ucontext_to_reg(const ucontext_t *uc, struct reg *r)
+pt_ucontext_to_reg(const ucontext_t *uc __unused, struct reg *r __unused)
 {
 }
 
 void
-pt_fpreg_to_ucontext(const struct fpreg* r, ucontext_t *uc)
+pt_fpreg_to_ucontext(const struct fpreg* r __unused, ucontext_t *uc __unused)
 {
 }
 
 void
-pt_ucontext_to_fpreg(const ucontext_t *uc, struct fpreg *r)
+pt_ucontext_to_fpreg(const ucontext_t *uc __unused, struct fpreg *r __unused)
 {
 }
 
@@ -56,7 +59,7 @@ pt_md_init(void)
 }
 
 int
-pt_reg_sstep(struct reg *reg, int step)
+pt_reg_sstep(struct reg *reg __unused, int step __unused)
 {
 	return (0);
 }

Modified: stable/7/lib/libthread_db/libpthread_db.c
==============================================================================
--- stable/7/lib/libthread_db/libpthread_db.c	Tue Jun  9 00:27:23 2009	(r193788)
+++ stable/7/lib/libthread_db/libpthread_db.c	Tue Jun  9 00:47:54 2009	(r193789)
@@ -70,7 +70,7 @@ ps2td(int c)
 }
 
 static long
-pt_map_thread(const td_thragent_t *const_ta, psaddr_t pt, int type)
+pt_map_thread(const td_thragent_t *const_ta, psaddr_t pt, enum pt_type type)
 {
 	td_thragent_t *ta = __DECONST(td_thragent_t *, const_ta);
 	struct pt_map *new;
@@ -220,7 +220,6 @@ static td_err_e
 pt_ta_map_id2thr(const td_thragent_t *ta, thread_t id, td_thrhandle_t *th)
 {
 	prgregset_t gregs;
-	TAILQ_HEAD(, pthread) thread_list;
 	psaddr_t pt, tcb_addr;
 	lwpid_t lwp;
 	int ret;
@@ -229,28 +228,24 @@ pt_ta_map_id2thr(const td_thragent_t *ta
 
 	if (id < 0 || id >= ta->map_len || ta->map[id].type == PT_NONE)
 		return (TD_NOTHR);
-	ret = ps_pread(ta->ph, ta->thread_list_addr, &thread_list,
-			sizeof(thread_list));
+
+	ret = thr_pread_ptr(ta, ta->thread_list_addr, &pt);
 	if (ret != 0)
-		return (P2T(ret));
-	pt = (psaddr_t)thread_list.tqh_first;
+		return (TD_ERR);
 	if (ta->map[id].type == PT_LWP) {
 		/*
 		 * if we are referencing a lwp, make sure it was not already
 		 * mapped to user thread.
 		 */
 		while (pt != 0) {
-			ret = ps_pread(ta->ph,
-			        pt + ta->thread_off_tcb,
-			        &tcb_addr, sizeof(tcb_addr));
+			ret = thr_pread_ptr(ta, pt + ta->thread_off_tcb,
+			    &tcb_addr);
 			if (ret != 0)
-				return (P2T(ret));
-			ret = ps_pread(ta->ph,
-			        tcb_addr + ta->thread_off_tmbx + 
-				offsetof(struct kse_thr_mailbox, tm_lwp),
-				&lwp, sizeof(lwp));
+				return (TD_ERR);
+			ret = thr_pread_int(ta, tcb_addr + ta->thread_off_tmbx +
+			    offsetof(struct kse_thr_mailbox, tm_lwp), &lwp);
 			if (ret != 0)
-				return (P2T(ret));
+				return (TD_ERR);
 			/*
 			 * If the lwp was already mapped to userland thread,
 			 * we shouldn't reference it directly in future.
@@ -260,11 +255,9 @@ pt_ta_map_id2thr(const td_thragent_t *ta
 				return (TD_NOTHR);
 			}
 			/* get next thread */
-			ret = ps_pread(ta->ph,
-			        pt + ta->thread_off_next,
-			        &pt, sizeof(pt));
+			ret = thr_pread_ptr(ta, pt + ta->thread_off_next, &pt);
 			if (ret != 0)
-				return (P2T(ret));
+				return (TD_ERR);
 		}
 		/* check lwp */
 		ret = ps_lgetregs(ta->ph, ta->map[id].lwp, gregs);
@@ -275,17 +268,14 @@ pt_ta_map_id2thr(const td_thragent_t *ta
 		}
 	} else {
 		while (pt != 0 && ta->map[id].thr != pt) {
-			ret = ps_pread(ta->ph,
-				pt + ta->thread_off_tcb,
-				&tcb_addr, sizeof(tcb_addr));
+			ret = thr_pread_ptr(ta, pt + ta->thread_off_tcb,
+			    &tcb_addr);
 			if (ret != 0)
-				return (P2T(ret));
+				return (TD_ERR);
 			/* get next thread */
-			ret = ps_pread(ta->ph,
-				pt + ta->thread_off_next,
-				&pt, sizeof(pt));
+			ret = thr_pread_ptr(ta, pt + ta->thread_off_next, &pt);
 			if (ret != 0)
-				return (P2T(ret));
+				return (TD_ERR);
 		}
 
 		if (pt == 0) {
@@ -303,29 +293,24 @@ pt_ta_map_id2thr(const td_thragent_t *ta
 static td_err_e
 pt_ta_map_lwp2thr(const td_thragent_t *ta, lwpid_t lwp, td_thrhandle_t *th)
 {
-	TAILQ_HEAD(, pthread) thread_list;
-	psaddr_t pt, ptr;
-	lwpid_t tmp_lwp;
+	psaddr_t pt, tcb_addr;
+	lwpid_t lwp1;
 	int ret;
-	
+
 	TDBG_FUNC();
 
-	ret = ps_pread(ta->ph, ta->thread_list_addr, &thread_list,
-	                sizeof(thread_list));
+	ret = thr_pread_ptr(ta, ta->thread_list_addr, &pt);
 	if (ret != 0)
-		return (P2T(ret));
-	pt = (psaddr_t)thread_list.tqh_first;
+		return (TD_ERR);
 	while (pt != 0) {
-		ret = ps_pread(ta->ph, pt + ta->thread_off_tcb,
-				&ptr, sizeof(ptr));
+		ret = thr_pread_ptr(ta, pt + ta->thread_off_tcb, &tcb_addr);
 		if (ret != 0)
-			return (P2T(ret));
-		ptr += ta->thread_off_tmbx +
-		       offsetof(struct kse_thr_mailbox, tm_lwp);
-		ret = ps_pread(ta->ph, ptr, &tmp_lwp, sizeof(lwpid_t));
+			return (TD_ERR);
+		ret = thr_pread_int(ta, tcb_addr + ta->thread_off_tmbx +
+		    offsetof(struct kse_thr_mailbox, tm_lwp), &lwp1);
 		if (ret != 0)
-			return (P2T(ret));
-		if (tmp_lwp == lwp) {
+			return (TD_ERR);
+		if (lwp1 == lwp) {
 			th->th_ta = ta;
 			th->th_tid = pt_map_thread(ta, pt, PT_USER);
 			if (th->th_tid == -1)
@@ -336,28 +321,23 @@ pt_ta_map_lwp2thr(const td_thragent_t *t
 		}
 
 		/* get next thread */
-		ret = ps_pread(ta->ph,
-		           pt + ta->thread_off_next,
-		           &pt, sizeof(pt));
+		ret = thr_pread_ptr(ta, pt + ta->thread_off_next, &pt);
 		if (ret != 0)
-			return (P2T(ret));
+			return (TD_ERR);
 	}
 
 	return (TD_NOTHR);
 }
 
 static td_err_e
-pt_ta_thr_iter(const td_thragent_t *ta,
-               td_thr_iter_f *callback, void *cbdata_p,
-               td_thr_state_e state, int ti_pri,
-               sigset_t *ti_sigmask_p,
-               unsigned int ti_user_flags)
+pt_ta_thr_iter(const td_thragent_t *ta, td_thr_iter_f *callback,
+    void *cbdata_p, td_thr_state_e state __unused, int ti_pri __unused,
+    sigset_t *ti_sigmask_p __unused, unsigned int ti_user_flags __unused)
 {
-	TAILQ_HEAD(, pthread) thread_list;
 	td_thrhandle_t th;
 	psaddr_t pt;
 	ps_err_e pserr;
-	int activated;
+	int activated, ret;
 
 	TDBG_FUNC();
 
@@ -368,11 +348,9 @@ pt_ta_thr_iter(const td_thragent_t *ta,
 	if (!activated)
 		return (TD_OK);
 
-	pserr = ps_pread(ta->ph, ta->thread_list_addr, &thread_list,
-	    sizeof(thread_list));
-	if (pserr != 0)
-		return (P2T(pserr));
-	pt = (psaddr_t)thread_list.tqh_first;
+	ret = thr_pread_ptr(ta, ta->thread_list_addr, &pt);
+	if (ret != 0)
+		return (TD_ERR);
 	while (pt != 0) {
 		th.th_ta = ta;
 		th.th_tid = pt_map_thread(ta, pt, PT_USER);
@@ -383,11 +361,9 @@ pt_ta_thr_iter(const td_thragent_t *ta,
 		if ((*callback)(&th, cbdata_p))
 			return (TD_DBERR);
 		/* get next thread */
-		pserr = ps_pread(ta->ph,
-		    pt + ta->thread_off_next, &pt,
-		    sizeof(pt));
-		if (pserr != PS_OK)
-			return (P2T(pserr));
+		ret = thr_pread_ptr(ta, pt + ta->thread_off_next, &pt);
+		if (ret != 0)
+			return (TD_ERR);
 	}
 	return (TD_OK);
 }
@@ -395,7 +371,7 @@ pt_ta_thr_iter(const td_thragent_t *ta,
 static td_err_e
 pt_ta_tsd_iter(const td_thragent_t *ta, td_key_iter_f *ki, void *arg)
 {
-	char *keytable;
+	void *keytable;
 	void *destructor;
 	int i, ret, allocated;
 
@@ -411,10 +387,10 @@ pt_ta_tsd_iter(const td_thragent_t *ta, 
 		return (P2T(ret));
 	}	
 	for (i = 0; i < ta->thread_max_keys; i++) {
-		allocated = *(int *)(keytable + i * ta->thread_size_key +
-			ta->thread_off_key_allocated);
-		destructor = *(void **)(keytable + i * ta->thread_size_key +
-			ta->thread_off_key_destructor);
+		allocated = *(int *)(void *)((uintptr_t)keytable +
+		    i * ta->thread_size_key + ta->thread_off_key_allocated);
+		destructor = *(void **)(void *)((uintptr_t)keytable +
+		    i * ta->thread_size_key + ta->thread_off_key_destructor);
 		if (allocated) {
 			ret = (ki)(i, destructor, arg);
 			if (ret != 0) {
@@ -428,28 +404,32 @@ pt_ta_tsd_iter(const td_thragent_t *ta, 
 }
 
 static td_err_e
-pt_ta_event_addr(const td_thragent_t *ta, td_event_e event, td_notify_t *ptr)
+pt_ta_event_addr(const td_thragent_t *ta __unused, td_event_e event __unused,
+    td_notify_t *ptr __unused)
 {
 	TDBG_FUNC();
 	return (TD_ERR);
 }
 
 static td_err_e
-pt_ta_set_event(const td_thragent_t *ta, td_thr_events_t *events)
+pt_ta_set_event(const td_thragent_t *ta __unused,
+    td_thr_events_t *events __unused)
 {
 	TDBG_FUNC();
 	return (0);
 }
 
 static td_err_e
-pt_ta_clear_event(const td_thragent_t *ta, td_thr_events_t *events)
+pt_ta_clear_event(const td_thragent_t *ta __unused,
+    td_thr_events_t *events __unused)
 {
 	TDBG_FUNC();
 	return (0);
 }
 
 static td_err_e
-pt_ta_event_getmsg(const td_thragent_t *ta, td_event_msg_t *msg)
+pt_ta_event_getmsg(const td_thragent_t *ta __unused,
+    td_event_msg_t *msg __unused)
 {
 	TDBG_FUNC();
 	return (TD_NOMSG);
@@ -458,7 +438,7 @@ pt_ta_event_getmsg(const td_thragent_t *
 static td_err_e
 pt_dbsuspend(const td_thrhandle_t *th, int suspend)
 {
-	td_thragent_t *ta = (td_thragent_t *)th->th_ta;
+	const td_thragent_t *ta = th->th_ta;
 	psaddr_t tcb_addr, tmbx_addr, ptr;
 	lwpid_t lwp;
 	uint32_t dflags;
@@ -952,28 +932,31 @@ pt_thr_setgregs(const td_thrhandle_t *th
 }
 
 static td_err_e
-pt_thr_event_enable(const td_thrhandle_t *th, int en)
+pt_thr_event_enable(const td_thrhandle_t *th __unused, int en __unused)
 {
 	TDBG_FUNC();
 	return (0);
 }
 
 static td_err_e
-pt_thr_set_event(const td_thrhandle_t *th, td_thr_events_t *setp)
+pt_thr_set_event(const td_thrhandle_t *th __unused,
+    td_thr_events_t *setp __unused)
 {
 	TDBG_FUNC();
 	return (0);
 }
 
 static td_err_e
-pt_thr_clear_event(const td_thrhandle_t *th, td_thr_events_t *setp)
+pt_thr_clear_event(const td_thrhandle_t *th __unused,
+    td_thr_events_t *setp __unused)
 {
 	TDBG_FUNC();
 	return (0);
 }
 
 static td_err_e
-pt_thr_event_getmsg(const td_thrhandle_t *th, td_event_msg_t *msg)
+pt_thr_event_getmsg(const td_thrhandle_t *th __unused,
+    td_event_msg_t *msg __unused)
 {
 	TDBG_FUNC();
 	return (TD_NOMSG);
@@ -1074,17 +1057,16 @@ pt_validate(const td_thrhandle_t *th)
 	return (TD_OK);
 }
 
-td_err_e
-pt_thr_tls_get_addr(const td_thrhandle_t *th, void *_linkmap, size_t offset,
-		    void **address)
+static td_err_e
+pt_thr_tls_get_addr(const td_thrhandle_t *th, psaddr_t _linkmap, size_t offset,
+    psaddr_t *address)
 {
-	char *obj_entry;
 	const td_thragent_t *ta = th->th_ta;
-	psaddr_t tcb_addr, *dtv_addr;
+	psaddr_t dtv_addr, obj_entry, tcb_addr;
 	int tls_index, ret;
 
 	/* linkmap is a member of Obj_Entry */
-	obj_entry = (char *)_linkmap - ta->thread_off_linkmap;
+	obj_entry = _linkmap - ta->thread_off_linkmap;
 
 	/* get tlsindex of the object file */
 	ret = ps_pread(ta->ph,
@@ -1106,8 +1088,8 @@ pt_thr_tls_get_addr(const td_thrhandle_t
 	if (ret != 0)
 		return (P2T(ret));
 	/* now get the object's tls block base address */
-	ret = ps_pread(ta->ph, &dtv_addr[tls_index+1], address,
-		sizeof(*address));
+	ret = ps_pread(ta->ph, dtv_addr + sizeof(void *) * (tls_index + 1),
+	    address, sizeof(*address));
 	if (ret != 0)
 		return (P2T(ret));
 

Modified: stable/7/lib/libthread_db/libpthread_db.h
==============================================================================
--- stable/7/lib/libthread_db/libpthread_db.h	Tue Jun  9 00:27:23 2009	(r193788)
+++ stable/7/lib/libthread_db/libpthread_db.h	Tue Jun  9 00:47:54 2009	(r193789)
@@ -34,13 +34,14 @@
 
 #include "thread_db_int.h"
 
-struct pt_map {
-	enum {
-		PT_NONE,
-		PT_USER,
-		PT_LWP
-	} type;
+enum pt_type {
+	PT_NONE,
+	PT_USER,
+	PT_LWP
+};
 
+struct pt_map {
+	enum pt_type	type;
 	union {
 		lwpid_t		lwp;
 		psaddr_t	thr;

Modified: stable/7/lib/libthread_db/libthr_db.c
==============================================================================
--- stable/7/lib/libthread_db/libthr_db.c	Tue Jun  9 00:27:23 2009	(r193788)
+++ stable/7/lib/libthread_db/libthr_db.c	Tue Jun  9 00:47:54 2009	(r193789)
@@ -201,36 +201,30 @@ pt_ta_delete(td_thragent_t *ta)
 static td_err_e
 pt_ta_map_id2thr(const td_thragent_t *ta, thread_t id, td_thrhandle_t *th)
 {
-	TAILQ_HEAD(, pthread) thread_list;
 	psaddr_t pt;
-	long lwp;
+	int32_t lwp;
 	int ret;
 
 	TDBG_FUNC();
 
 	if (id == 0)
 		return (TD_NOTHR);
-	ret = ps_pread(ta->ph, ta->thread_list_addr, &thread_list,
-		sizeof(thread_list));
+	ret = thr_pread_ptr(ta, ta->thread_list_addr, &pt);
 	if (ret != 0)
-		return (P2T(ret));
+		return (TD_ERR);
 	/* Iterate through thread list to find pthread */
-	pt = (psaddr_t)thread_list.tqh_first;
-	while (pt != NULL) {
-		ret = ps_pread(ta->ph, pt + ta->thread_off_tid,
-			       &lwp, sizeof(lwp));
+	while (pt != 0) {
+		ret = thr_pread_int(ta, pt + ta->thread_off_tid, &lwp);
 		if (ret != 0)
-			return (P2T(ret));
+			return (TD_ERR);
 		if (lwp == id)
 			break;
 		/* get next thread */
-		ret = ps_pread(ta->ph,
-				pt + ta->thread_off_next,
-				&pt, sizeof(pt));
+		ret = thr_pread_ptr(ta, pt + ta->thread_off_next, &pt);
 		if (ret != 0)
-			return (P2T(ret));
+			return (TD_ERR);
 	}
-	if (pt == NULL)
+	if (pt == 0)
 		return (TD_NOTHR);
 	th->th_ta = ta;
 	th->th_tid = id;
@@ -245,30 +239,24 @@ pt_ta_map_lwp2thr(const td_thragent_t *t
 }
 
 static td_err_e
-pt_ta_thr_iter(const td_thragent_t *ta,
-               td_thr_iter_f *callback, void *cbdata_p,
-               td_thr_state_e state, int ti_pri,
-               sigset_t *ti_sigmask_p,
-               unsigned int ti_user_flags)
+pt_ta_thr_iter(const td_thragent_t *ta, td_thr_iter_f *callback,
+    void *cbdata_p, td_thr_state_e state __unused, int ti_pri __unused,
+    sigset_t *ti_sigmask_p __unused, unsigned int ti_user_flags __unused)
 {
-	TAILQ_HEAD(, pthread) thread_list;
 	td_thrhandle_t th;
 	psaddr_t pt;
-	long lwp;
+	int32_t lwp;
 	int ret;
 
 	TDBG_FUNC();
 
-	ret = ps_pread(ta->ph, ta->thread_list_addr, &thread_list,
-		       sizeof(thread_list));
+	ret = thr_pread_ptr(ta, ta->thread_list_addr, &pt);
 	if (ret != 0)
-		return (P2T(ret));
-	pt = (psaddr_t)thread_list.tqh_first;
+		return (TD_ERR);
 	while (pt != 0) {
-		ret = ps_pread(ta->ph, pt + ta->thread_off_tid, &lwp,
-			      sizeof(lwp));
+		ret = thr_pread_int(ta, pt + ta->thread_off_tid, &lwp);
 		if (ret != 0)
-			return (P2T(ret));
+			return (TD_ERR);
 		if (lwp != 0 && lwp != TERMINATED) {
 			th.th_ta = ta;
 			th.th_tid = (thread_t)lwp;
@@ -277,10 +265,9 @@ pt_ta_thr_iter(const td_thragent_t *ta,
 				return (TD_DBERR);
 		}
 		/* get next thread */
-		ret = ps_pread(ta->ph, pt + ta->thread_off_next, &pt,
-			       sizeof(pt));
+		ret = thr_pread_ptr(ta, pt + ta->thread_off_next, &pt);
 		if (ret != 0)
-			return (P2T(ret));
+			return (TD_ERR);
 	}
 	return (TD_OK);
 }
@@ -288,7 +275,7 @@ pt_ta_thr_iter(const td_thragent_t *ta,
 static td_err_e
 pt_ta_tsd_iter(const td_thragent_t *ta, td_key_iter_f *ki, void *arg)
 {
-	char *keytable;
+	void *keytable;
 	void *destructor;
 	int i, ret, allocated;
 
@@ -304,10 +291,10 @@ pt_ta_tsd_iter(const td_thragent_t *ta, 
 		return (P2T(ret));
 	}
 	for (i = 0; i < ta->thread_max_keys; i++) {
-		allocated = *(int *)(keytable + i * ta->thread_size_key +
-			ta->thread_off_key_allocated);
-		destructor = *(void **)(keytable + i * ta->thread_size_key +
-			ta->thread_off_key_destructor);
+		allocated = *(int *)(void *)((uintptr_t)keytable +
+		    i * ta->thread_size_key + ta->thread_off_key_allocated);
+		destructor = *(void **)(void *)((uintptr_t)keytable +
+		    i * ta->thread_size_key + ta->thread_off_key_destructor);
 		if (allocated) {
 			ret = (ki)(i, destructor, arg);
 			if (ret != 0) {
@@ -379,24 +366,23 @@ pt_ta_event_getmsg(const td_thragent_t *
 {
 	static td_thrhandle_t handle;
 
-	psaddr_t pt, pt_temp;
+	psaddr_t pt;
 	td_thr_events_e	tmp;
-	long lwp;
+	int32_t lwp;
 	int ret;
 
 	TDBG_FUNC();
 
-	ret = ps_pread(ta->ph, ta->thread_last_event_addr, &pt, sizeof(pt));
+	ret = thr_pread_ptr(ta, ta->thread_last_event_addr, &pt);
 	if (ret != 0)
-		return (P2T(ret));
-	if (pt == NULL)
+		return (TD_ERR);
+	if (pt == 0)
 		return (TD_NOMSG);
 	/*
 	 * Take the event pointer, at the time, libthr only reports event
 	 * once a time, so it is not a link list.
 	 */
-	pt_temp = NULL;
-	ps_pwrite(ta->ph, ta->thread_last_event_addr, &pt_temp, sizeof(pt_temp));
+	thr_pwrite_ptr(ta, ta->thread_last_event_addr, 0);
 
 	/* Read event info */
 	ret = ps_pread(ta->ph, pt + ta->thread_off_event_buf, msg, sizeof(*msg));
@@ -408,21 +394,21 @@ pt_ta_event_getmsg(const td_thragent_t *
 	tmp = 0;
 	ps_pwrite(ta->ph, pt + ta->thread_off_event_buf, &tmp, sizeof(tmp));
 	/* Convert event */
-	pt = (psaddr_t)msg->th_p;
-	ret = ps_pread(ta->ph, pt + ta->thread_off_tid, &lwp, sizeof(lwp));
+	pt = msg->th_p;
+	ret = thr_pread_int(ta, pt + ta->thread_off_tid, &lwp);
 	if (ret != 0)
-		return (P2T(ret));
+		return (TD_ERR);
 	handle.th_ta = ta;
 	handle.th_tid = lwp;
 	handle.th_thread = pt;
-	msg->th_p = &handle;
+	msg->th_p = (uintptr_t)&handle;
 	return (0);
 }
 
 static td_err_e
 pt_dbsuspend(const td_thrhandle_t *th, int suspend)
 {
-	td_thragent_t *ta = (td_thragent_t *)th->th_ta;
+	const td_thragent_t *ta = th->th_ta;
 	int ret;
 
 	TDBG_FUNC();
@@ -480,14 +466,13 @@ pt_thr_get_info(const td_thrhandle_t *th
 	ret = pt_validate(th);
 	if (ret)
 		return (ret);
-	ret = ps_pread(ta->ph, th->th_thread + ta->thread_off_state,
-	               &state, sizeof(state));
+	ret = thr_pread_int(ta, th->th_thread + ta->thread_off_state, &state);
 	if (ret != 0)
-		return (P2T(ret));
-	ret = ps_pread(ta->ph, th->th_thread + ta->thread_off_report_events,
-		&info->ti_traceme, sizeof(int));
+		return (TD_ERR);
+	ret = thr_pread_int(ta, th->th_thread + ta->thread_off_report_events,
+	    &info->ti_traceme);
 	if (ret != 0)
-		return (P2T(ret));
+		return (TD_ERR);
 	ret = ps_pread(ta->ph, th->th_thread + ta->thread_off_event_mask,
 		&info->ti_events, sizeof(td_thr_events_t));
 	if (ret != 0)
@@ -662,17 +647,17 @@ static td_err_e
 pt_thr_event_getmsg(const td_thrhandle_t *th, td_event_msg_t *msg)
 {
 	static td_thrhandle_t handle;
-	td_thragent_t *ta = (td_thragent_t *)th->th_ta;
+	const td_thragent_t *ta = th->th_ta;
 	psaddr_t pt, pt_temp;
-	long lwp;
+	int32_t lwp;
 	int ret;
 	td_thr_events_e	tmp;
 
 	TDBG_FUNC();
 	pt = th->th_thread;
-	ret = ps_pread(ta->ph, ta->thread_last_event_addr, &pt_temp, sizeof(pt_temp));
+	ret = thr_pread_ptr(ta, ta->thread_last_event_addr, &pt_temp);
 	if (ret != 0)
-		return (P2T(ret));
+		return (TD_ERR);
 	/* Get event */
 	ret = ps_pread(ta->ph, pt + ta->thread_off_event_buf, msg, sizeof(*msg));
 	if (ret != 0)
@@ -683,27 +668,26 @@ pt_thr_event_getmsg(const td_thrhandle_t
 	 * Take the event pointer, at the time, libthr only reports event
 	 * once a time, so it is not a link list.
 	 */
-	if (pt == pt_temp) {
-		pt_temp = NULL;
-		ps_pwrite(ta->ph, ta->thread_last_event_addr, &pt_temp, sizeof(pt_temp));
-	}
+	if (pt == pt_temp)
+		thr_pwrite_ptr(ta, ta->thread_last_event_addr, 0);
+
 	/* Clear event */
 	tmp = 0;
 	ps_pwrite(ta->ph, pt + ta->thread_off_event_buf, &tmp, sizeof(tmp));
 	/* Convert event */
-	pt = (psaddr_t)msg->th_p;
-	ret = ps_pread(ta->ph, pt + ta->thread_off_tid, &lwp, sizeof(lwp));
+	pt = msg->th_p;
+	ret = thr_pread_int(ta, pt + ta->thread_off_tid, &lwp);
 	if (ret != 0)
-		return (P2T(ret));
+		return (TD_ERR);
 	handle.th_ta = ta;
 	handle.th_tid = lwp;
 	handle.th_thread = pt;
-	msg->th_p = &handle;
+	msg->th_p = (uintptr_t)&handle;
 	return (0);
 }
 
 static td_err_e
-pt_thr_sstep(const td_thrhandle_t *th, int step)
+pt_thr_sstep(const td_thrhandle_t *th, int step __unused)
 {
 	TDBG_FUNC();
 
@@ -714,22 +698,21 @@ static int
 pt_validate(const td_thrhandle_t *th)
 {
 
-	if (th->th_tid == 0 || th->th_thread == NULL)
+	if (th->th_tid == 0 || th->th_thread == 0)
 		return (TD_ERR);
 	return (TD_OK);
 }
 
 static td_err_e
-pt_thr_tls_get_addr(const td_thrhandle_t *th, void *_linkmap, size_t offset,
-		    void **address)
+pt_thr_tls_get_addr(const td_thrhandle_t *th, psaddr_t _linkmap, size_t offset,
+    psaddr_t *address)
 {
-	char *obj_entry;
 	const td_thragent_t *ta = th->th_ta;
-	psaddr_t tcb_addr, *dtv_addr;
+	psaddr_t dtv_addr, obj_entry, tcb_addr;
 	int tls_index, ret;
 
 	/* linkmap is a member of Obj_Entry */
-	obj_entry = (char *)_linkmap - ta->thread_off_linkmap;
+	obj_entry = _linkmap - ta->thread_off_linkmap;
 
 	/* get tlsindex of the object file */
 	ret = ps_pread(ta->ph,
@@ -750,8 +733,8 @@ pt_thr_tls_get_addr(const td_thrhandle_t
 	if (ret != 0)
 		return (P2T(ret));
 	/* now get the object's tls block base address */
-	ret = ps_pread(ta->ph, &dtv_addr[tls_index+1], address,
-		sizeof(*address));
+	ret = ps_pread(ta->ph, dtv_addr + sizeof(void *) * (tls_index+1),
+	    address, sizeof(*address));
 	if (ret != 0)
 		return (P2T(ret));
 

Modified: stable/7/lib/libthread_db/thread_db.c
==============================================================================
--- stable/7/lib/libthread_db/thread_db.c	Tue Jun  9 00:27:23 2009	(r193788)
+++ stable/7/lib/libthread_db/thread_db.c	Tue Jun  9 00:47:54 2009	(r193789)
@@ -32,6 +32,8 @@ __FBSDID("$FreeBSD$");
 #include <thread_db.h>
 #include <unistd.h>
 #include <sys/cdefs.h>
+#include <sys/endian.h>
+#include <sys/errno.h>
 #include <sys/linker_set.h>
 
 #include "thread_db_int.h"
@@ -50,7 +52,6 @@ td_init(void)
 {
 	td_err_e ret, tmp;
 	struct ta_ops *ops_p, **ops_pp;
-	size_t i;
 
 	ret = 0;
 	SET_FOREACH(ops_pp, __ta_ops) {
@@ -104,7 +105,6 @@ td_ta_map_lwp2thr(const td_thragent_t *t
 td_err_e
 td_ta_new(struct ps_prochandle *ph, td_thragent_t **pta)
 {
-	size_t i;
 	struct ta_ops *ops_p, **ops_pp;
 
 	SET_FOREACH(ops_pp, __ta_ops) {
@@ -244,8 +244,8 @@ td_thr_validate(const td_thrhandle_t *th
 }
 
 td_err_e
-td_thr_tls_get_addr(const td_thrhandle_t *th, void *linkmap, size_t offset,
-		    void **address)
+td_thr_tls_get_addr(const td_thrhandle_t *th, psaddr_t linkmap, size_t offset,
+    psaddr_t *address)
 {
 	const td_thragent_t *ta = th->th_ta;
 	return (ta->ta_ops->to_thr_tls_get_addr(th, linkmap, offset, address));
@@ -259,3 +259,176 @@ td_thr_sstep(const td_thrhandle_t *th, i
 	const td_thragent_t *ta = th->th_ta;
 	return (ta->ta_ops->to_thr_sstep(th, step));
 }
+
+/*
+ * Support functions for reading from and writing to the target
+ * address space.
+ */
+
+static int
+thr_pread(struct ps_prochandle *ph, psaddr_t addr, uint64_t *val,
+    u_int size, u_int byteorder)
+{
+	uint8_t buf[sizeof(*val)];
+	ps_err_e err;
+
+	if (size > sizeof(buf))
+		return (EOVERFLOW);
+
+	err = ps_pread(ph, addr, buf, size);
+	if (err != PS_OK)
+		return (EFAULT);
+
+	switch (byteorder) {
+	case BIG_ENDIAN:
+		switch (size) {
+		case 1:
+			*val = buf[0];
+			break;
+		case 2:
+			*val = be16dec(buf);
+			break;
+		case 4:
+			*val = be32dec(buf);
+			break;
+		case 8:
+			*val = be64dec(buf);
+			break;
+		default:
+			return (EINVAL);
+		}
+		break;
+	case LITTLE_ENDIAN:
+		switch (size) {
+		case 1:
+			*val = buf[0];
+			break;
+		case 2:
+			*val = le16dec(buf);
+			break;
+		case 4:
+			*val = le32dec(buf);
+			break;
+		case 8:
+			*val = le64dec(buf);
+			break;
+		default:
+			return (EINVAL);
+		}
+		break;
+	default:
+		return (EINVAL);
+	}
+
+	return (0);
+}
+
+int
+thr_pread_int(const struct td_thragent *ta, psaddr_t addr, uint32_t *val)
+{
+	uint64_t tmp;
+	int error;
+
+	error = thr_pread(ta->ph, addr, &tmp, sizeof(int), BYTE_ORDER);
+	if (!error)
+		*val = tmp;
+
+	return (error);
+}
+
+int
+thr_pread_long(const struct td_thragent *ta, psaddr_t addr, uint64_t *val)
+{
+
+	return (thr_pread(ta->ph, addr, val, sizeof(long), BYTE_ORDER));
+}
+
+int
+thr_pread_ptr(const struct td_thragent *ta, psaddr_t addr, psaddr_t *val)
+{
+	uint64_t tmp;
+	int error;
+
+	error = thr_pread(ta->ph, addr, &tmp, sizeof(void *), BYTE_ORDER);
+	if (!error)
+		*val = tmp;
+
+	return (error);
+}
+
+static int
+thr_pwrite(struct ps_prochandle *ph, psaddr_t addr, uint64_t val,

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-stable mailing list