Date: Sun, 18 Jul 2004 03:12:36 GMT From: David Xu <davidxu@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 57580 for review Message-ID: <200407180312.i6I3Cata071770@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=57580 Change 57580 by davidxu@davidxu_alona on 2004/07/18 03:11:49 resolve conflict with @57576 Affected files ... .. //depot/projects/davidxu_ksedbg/src/gnu/usr.bin/gdb/libgdb/fbsd-threads.c#13 integrate .. //depot/projects/davidxu_ksedbg/src/include/proc_service.h#5 integrate .. //depot/projects/davidxu_ksedbg/src/lib/libthread_db/Makefile#2 integrate .. //depot/projects/davidxu_ksedbg/src/lib/libthread_db/include/thread_db_int.h#2 integrate .. //depot/projects/davidxu_ksedbg/src/lib/libthread_db/pthread/Makefile#2 integrate .. //depot/projects/davidxu_ksedbg/src/lib/libthread_db/pthread/pthread_db.c#9 integrate .. //depot/projects/davidxu_ksedbg/src/lib/libthread_db/pthread/pthread_db.h#3 integrate .. //depot/projects/davidxu_ksedbg/src/lib/libthread_db/pthread/pthread_db_i386.c#2 integrate .. //depot/projects/davidxu_ksedbg/src/lib/libthread_db/src/Makefile#2 integrate .. //depot/projects/davidxu_ksedbg/src/lib/libthread_db/src/thread_db.c#3 integrate Differences ... ==== //depot/projects/davidxu_ksedbg/src/gnu/usr.bin/gdb/libgdb/fbsd-threads.c#13 (text+ko) ==== @@ -1,4 +1,4 @@ -/* $FreeBSD: src/gnu/usr.bin/gdb/libgdb/fbsd-threads.c,v 1.2 2004/07/16 06:11:48 davidxu Exp $ */ +/* $FreeBSD: src/gnu/usr.bin/gdb/libgdb/fbsd-threads.c,v 1.3 2004/07/17 17:08:13 marcel Exp $ */ /* FreeBSD libthread_db assisted debugging support. Copyright 1999, 2000, 2001 Free Software Foundation, Inc. @@ -70,7 +70,7 @@ static td_thragent_t *thread_agent; /* The last thread we are single stepping */ -static lwpid_t last_single_step_lwp; +static ptid_t last_single_step_thread; /* Pointers to the libthread_db functions. */ @@ -383,7 +383,7 @@ td_thrinfo_t ti; ptid_t work_ptid; int resume_all, ret; - long lwp; + long lwp, thvalid = 0; #if 0 printf_filtered("%s ptid=%ld.%ld.%ld step=%d\n", __func__, @@ -399,7 +399,7 @@ return; } - if (GET_PID (ptid) != -1 && step != 0) + if (GET_PID(ptid) != -1 && step != 0) { resume_all = 0; work_ptid = ptid; @@ -432,59 +432,49 @@ ret = td_thr_get_info_p (&th, &ti); if (ret) error (thread_db_err_str (ret)); + thvalid = 1; lwp = ti.ti_lid; } - if (!resume_all && lwp == 0) - { - error ("sorry this version of FreeBSD can not resume inactivated thread"); - } - if (lwp) { int req = step ? PT_SETSTEP : PT_CLEARSTEP; - if (ptrace (req, (pid_t) lwp, 0, 0)) + if (ptrace (req, (pid_t) lwp, (caddr_t) 1, target_signal_to_host(signo))) perror_with_name ("PT_SETSTEP/PT_CLEARSTEP"); } - int nlwps = ptrace (PT_GETNUMLWPS, proc_handle.pid, 0, 0); - if (nlwps == -1) - perror_with_name ("PT_GETNUMLWPS"); - lwpid_t *lwps = malloc (nlwps * sizeof(lwpid_t)); - nlwps = ptrace (PT_GETLWPLIST, proc_handle.pid, (caddr_t)lwps, nlwps); - if (nlwps == -1) + if (!ptid_equal (last_single_step_thread, null_ptid)) { - perror_with_name ("PT_GETLWPLIST"); - free (lwps); + ret = td_ta_thr_iter_p (thread_agent, resume_thread_callback, NULL, + TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY, + TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS); + if (ret != TD_OK) + error ("resume error: %s", thread_db_err_str (ret)); } - int i; - if (last_single_step_lwp != 0) + if (!resume_all) { - /* resume all threads if ever suspend them */ - for (i = 0; i < nlwps; ++i) - { - if (ptrace (PT_RESUME, lwps[i], 0, 0)) - perror_with_name ("PT_SUSPEND"); - } + ret = td_ta_thr_iter_p (thread_agent, suspend_thread_callback, NULL, + TD_THR_ANY_STATE, TD_THR_LOWEST_PRIORITY, + TD_SIGNO_MASK, TD_THR_ANY_USER_FLAGS); + if (ret != TD_OK) + error ("suspend error: %s", thread_db_err_str (ret)); + last_single_step_thread = work_ptid; } + else + last_single_step_thread = null_ptid; - if (!resume_all) + if (thvalid) { - for (i = 0; i < nlwps; ++i) - { - if (lwps[i] == lwp) - continue; - if (ptrace (PT_SUSPEND, lwps[i], 0, 0)) - perror_with_name ("PT_SUSPEND"); - } - last_single_step_lwp = lwp; + ret = td_thr_dbresume_p (&th); + if (ret != TD_OK) + error ("resume error: %s", thread_db_err_str (ret)); } else - last_single_step_lwp = 0; - - free (lwps); -/* ret = ptrace(PT_RESUME, lwp, 0, 0); */ + { + /* it is not necessary, put it here for completness */ + ret = ptrace(PT_RESUME, lwp, 0, 0); + } /* now continue the process, suspended thread wont run */ if (ptrace (PT_CONTINUE, proc_handle.pid , (caddr_t)1, @@ -1007,62 +997,69 @@ } ps_err_e -ps_pdread (struct ps_prochandle *ph, psaddr_t addr, void *buf, size_t len) +ps_pread (struct ps_prochandle *ph, psaddr_t addr, void *buf, size_t len) { return target_read_memory ((CORE_ADDR) addr, buf, len); } ps_err_e -ps_pdwrite (struct ps_prochandle *ph, psaddr_t addr, const void *buf, +ps_pwrite (struct ps_prochandle *ph, psaddr_t addr, const void *buf, size_t len) { return target_write_memory ((CORE_ADDR) addr, (void *)buf, len); } ps_err_e -ps_ptread (struct ps_prochandle *ph, psaddr_t addr, void *buf, size_t len) +ps_lgetregs (struct ps_prochandle *ph, lwpid_t lwpid, prgregset_t gregset) { - return target_read_memory ((CORE_ADDR) addr, buf, len); -} + struct cleanup *old_chain; -ps_err_e -ps_ptwrite (struct ps_prochandle *ph, psaddr_t addr, const void *buf, - size_t len) -{ - return target_write_memory ((CORE_ADDR) addr, (void *)buf, len); + old_chain = save_inferior_ptid (); + inferior_ptid = BUILD_LWP (lwpid, PIDGET (inferior_ptid)); + target_fetch_registers (-1); + fill_gregset (gregset, -1); + do_cleanups (old_chain); + return PS_OK; } ps_err_e -ps_lgetregs (struct ps_prochandle *ph, lwpid_t lwpid, prgregset_t gregset) +ps_lsetregs (struct ps_prochandle *ph, lwpid_t lwpid, const prgregset_t gregset) { - if (ptrace (PT_GETREGS, lwpid, (caddr_t)gregset, 0) == 0) - return PS_OK; - return PS_ERR; -} + struct cleanup *old_chain; -ps_err_e -ps_lsetregs (struct ps_prochandle *ph, lwpid_t lwpid, const prgregset_t gregset) -{ - if (ptrace (PT_SETREGS, lwpid, (caddr_t)gregset, 0) == 0) - return PS_OK; - return PS_ERR; + old_chain = save_inferior_ptid (); + inferior_ptid = BUILD_LWP (lwpid, PIDGET (inferior_ptid)); + supply_gregset (gregset); + target_store_registers (-1); + do_cleanups (old_chain); + return PS_OK; } ps_err_e ps_lgetfpregs (struct ps_prochandle *ph, lwpid_t lwpid, prfpregset_t *fpregset) { - if (ptrace (PT_GETFPREGS, lwpid, (caddr_t)fpregset, 0) == 0) - return PS_OK; - return PS_ERR; + struct cleanup *old_chain; + + old_chain = save_inferior_ptid (); + inferior_ptid = BUILD_LWP (lwpid, PIDGET (inferior_ptid)); + target_fetch_registers (-1); + fill_fpregset (fpregset, -1); + do_cleanups (old_chain); + return PS_OK; } ps_err_e ps_lsetfpregs (struct ps_prochandle *ph, lwpid_t lwpid, const prfpregset_t *fpregset) { - if (ptrace (PT_SETFPREGS, lwpid, (caddr_t)fpregset, 0) == 0) - return PS_OK; - return PS_ERR; + struct cleanup *old_chain; + + old_chain = save_inferior_ptid (); + inferior_ptid = BUILD_LWP (lwpid, PIDGET (inferior_ptid)); + supply_fpregset (fpregset); + target_store_registers (-1); + do_cleanups (old_chain); + return PS_OK; } ps_err_e @@ -1080,10 +1077,3 @@ return PS_ERR; return PS_OK; } - -pid_t -ps_getpid (struct ps_prochandle *ph) -{ - return ph->pid; -} - ==== //depot/projects/davidxu_ksedbg/src/include/proc_service.h#5 (text+ko) ==== @@ -1,5 +1,6 @@ /* * Copyright (c) 2004 David Xu <davidxu@freebsd.org> + * Copyright (c) 2004 Marcel Moolenaar * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -10,18 +11,11 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) @@ -30,74 +24,42 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD$ + * $FreeBSD: src/include/proc_service.h,v 1.2 2004/07/17 17:05:12 marcel Exp $ */ #ifndef _PROC_SERVICE_H_ -#define _PROC_SERVICE_H_ +#define _PROC_SERVICE_H_ #include <sys/types.h> #include <sys/procfs.h> -struct ps_prochandle; +typedef enum { + PS_OK = 0, /* No errors. */ + PS_ERR, /* Generic error. */ + PS_BADADDR, /* Bad address. */ + PS_BADLID, /* Bad LWP Id. */ + PS_BADPID, /* Bad process Id. */ + PS_NOFREGS, /* FPU register set not available. */ + PS_NOSYM /* Symbol not found. */ +} ps_err_e; -typedef enum -{ - PS_OK, - PS_ERR, - PS_BADPID, - PS_BADLID, - PS_BADADDR, - PS_NOSYM, - PS_NOFREGS -} ps_err_e; +struct ps_prochandle; /* Opaque type. Defined by the implementor. */ -/* - * Every program that links libthread_db must provide a set of process control - * primitives to access memory and registers in the target process, to start - * and to stop the target process, and to look up symbols in the target process. - */ +__BEGIN_DECLS +ps_err_e ps_lcontinue(struct ps_prochandle *, lwpid_t); +ps_err_e ps_lgetfpregs(struct ps_prochandle *, lwpid_t, prfpregset_t *); +ps_err_e ps_lgetregs(struct ps_prochandle *, lwpid_t, prgregset_t); +ps_err_e ps_lsetfpregs(struct ps_prochandle *, lwpid_t, const prfpregset_t *); +ps_err_e ps_lsetregs(struct ps_prochandle *, lwpid_t, const prgregset_t); +ps_err_e ps_lstop(struct ps_prochandle *, lwpid_t); +ps_err_e ps_pcontinue(struct ps_prochandle *); +ps_err_e ps_pdmodel(struct ps_prochandle *, int *); +ps_err_e ps_pglobal_lookup(struct ps_prochandle *, const char *, const char *, + psaddr_t *); +void ps_plog(const char *, ...); +ps_err_e ps_pread(struct ps_prochandle *, psaddr_t, void *, size_t); +ps_err_e ps_pstop(struct ps_prochandle *); +ps_err_e ps_pwrite(struct ps_prochandle *, psaddr_t, const void *, size_t); +__END_DECLS -#if 0 -ps_err_e ps_pdmodel(struct ps_prochandle *ph, int *data_model); -#endif -ps_err_e ps_pglobal_lookup(struct ps_prochandle *ph, const char *object_name, - const char *sym_name , psaddr_t *sym_addr); -#if 0 -ps_err_e ps_pglobal_sym(struct ps_prochandle *ph, const char *object_name, - const char *sym_name , ps_sym_t *sym); -ps_err_e ps_pread(struct ps_prochandle *ph, psaddr_t addr, void *buf, - size_t size); -ps_err_e ps_pwrite(struct ps_prochandle *ph, psaddr_t addr, const void *buf, - size_t size); -#endif -ps_err_e ps_pdread(struct ps_prochandle *ph, psaddr_t addr, void *buf, - size_t size); -ps_err_e ps_pdwrite(struct ps_prochandle *ph, psaddr_t addr, const void *buf, - size_t size); -ps_err_e ps_ptread(struct ps_prochandle *ph, psaddr_t addr, void *buf, - size_t size); -ps_err_e ps_ptwrite(struct ps_prochandle *ph, psaddr_t addr, const void *buf, - size_t size); -ps_err_e ps_pstop(struct ps_prochandle *ph); -ps_err_e ps_pcontinue(struct ps_prochandle *ph); -ps_err_e ps_lstop(struct ps_prochandle *ph, lwpid_t lwpid); -ps_err_e ps_lcontinue(struct ps_prochandle *ph, lwpid_t lwpid); -ps_err_e ps_lgetregs(struct ps_prochandle *ph, lwpid_t lwpid, - prgregset_t gregset); -ps_err_e ps_lsetregs(struct ps_prochandle *ph, lwpid_t lwpid, - const prgregset_t gregset); -ps_err_e ps_lgetfpregs(struct ps_prochandle *ph, lwpid_t lwpid, - prfpregset_t *fpregset); -ps_err_e ps_lsetfpregs(struct ps_prochandle *ph, lwpid_t lwpid, - const prfpregset_t *fpregset); -#if 0 -ps_err_e ps_pauxv(struct ps_prochandle *ph, const auxv_t **auxp); -ps_err_e ps_kill(struct ps_prochandle *ph, int sig); -ps_err_e ps_lrolltoaddr(struct ps_prochandle *ph, lwpid_t lwpid, - psaddr_t go_addr, psaddr_t stop_addr); -#endif -void ps_plog(const char *fmt, ...); -pid_t ps_getpid (struct ps_prochandle *ph); - -#endif +#endif /* _PROC_SERVICE_H_ */ ==== //depot/projects/davidxu_ksedbg/src/lib/libthread_db/Makefile#2 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD$ +# $FreeBSD: src/lib/libthread_db/Makefile,v 1.1 2004/07/15 03:36:35 davidxu Exp $ SUBDIR=pthread src ==== //depot/projects/davidxu_ksedbg/src/lib/libthread_db/include/thread_db_int.h#2 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD$ + * $FreeBSD: src/lib/libthread_db/include/thread_db_int.h,v 1.2 2004/07/17 17:09:12 marcel Exp $ */ #ifndef _THREAD_DB_INT_H @@ -64,7 +64,7 @@ td_err_e (*to_thr_getxregs)(const td_thrhandle_t *, void *); td_err_e (*to_thr_getxregsize)(const td_thrhandle_t *, int *); td_err_e (*to_thr_setfpregs)(const td_thrhandle_t *, const prfpregset_t *); - td_err_e (*to_thr_setgregs)(const td_thrhandle_t *, prgregset_t); + td_err_e (*to_thr_setgregs)(const td_thrhandle_t *, const prgregset_t); td_err_e (*to_thr_setxregs)(const td_thrhandle_t *, const void *); td_err_e (*to_thr_event_enable)(const td_thrhandle_t *, int); td_err_e (*to_thr_set_event)(const td_thrhandle_t *, td_thr_events_t *); ==== //depot/projects/davidxu_ksedbg/src/lib/libthread_db/pthread/Makefile#2 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD$ +# $FreeBSD: src/lib/libthread_db/pthread/Makefile,v 1.1 2004/07/15 03:36:35 davidxu Exp $ LIB=pthread_db INTERNALLIB=yes ==== //depot/projects/davidxu_ksedbg/src/lib/libthread_db/pthread/pthread_db.c#9 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/lib/libthread_db/pthread/pthread_db.c,v 1.1 2004/07/15 03:36:35 davidxu Exp $"); +__FBSDID("$FreeBSD: src/lib/libthread_db/pthread/pthread_db.c,v 1.2 2004/07/17 17:09:12 marcel Exp $"); #include <stddef.h> #include <stdlib.h> @@ -662,7 +662,7 @@ } static td_err_e -pt_thr_setgregs(const td_thrhandle_t *th, prgregset_t gregs) +pt_thr_setgregs(const td_thrhandle_t *th, const prgregset_t gregs) { struct kse_thr_mailbox tmbx; pt_thragent_t *ta = (pt_thragent_t *)th->th_ta_p; @@ -842,6 +842,21 @@ ret = ps_pdread(ta->ph, ptr, &lwp, sizeof(lwpid_t)); if (ret != 0) return (P2T(ret)); + /* + * don't stop lwp assigned to a M:N thread, it belongs + * to UTS, UTS shouldn't be stopped. + */ + if (lwp != 0 && (attrflags & PTHREAD_SCOPE_SYSTEM)) { + /* dont' suspend signal thread */ + if (attrflags & THR_SIGNAL_THREAD) + return 0; + if (suspend) + ret = ps_lstop(ta->ph, lwp); + else + ret = ps_lcontinue(ta->ph, lwp); + return (P2T(ret)); + } + ret = ps_pdread(ta->ph, tmbx_addr + offsetof(struct kse_thr_mailbox, tm_dflags), &dflags, sizeof(dflags)); @@ -855,24 +870,6 @@ ret = ps_pdwrite(ta->ph, tmbx_addr + offsetof(struct kse_thr_mailbox, tm_dflags), &dflags, sizeof(dflags)); - if (ret) - return (P2T(ret)); - /* - * don't stop lwp assigned to a M:N thread, it belongs - * to UTS, UTS shouldn't be stopped. - */ - if (lwp != 0) {/* && (attrflags & PTHREAD_SCOPE_SYSTEM)) { */ - /* dont' suspend signal thread */ -#if 0 - if (attrflags & THR_SIGNAL_THREAD) - return 0; -#endif - if (suspend) - ret = ps_lstop(ta->ph, lwp); - else - ret = ps_lcontinue(ta->ph, lwp); - } - return (P2T(ret)); } ==== //depot/projects/davidxu_ksedbg/src/lib/libthread_db/pthread/pthread_db.h#3 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD$ + * $FreeBSD: src/lib/libthread_db/pthread/pthread_db.h,v 1.1 2004/07/15 03:36:35 davidxu Exp $ */ #ifndef _PTHREAD_DB_H ==== //depot/projects/davidxu_ksedbg/src/lib/libthread_db/pthread/pthread_db_i386.c#2 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); +__FBSDID("$FreeBSD: src/lib/libthread_db/pthread/pthread_db_i386.c,v 1.1 2004/07/15 03:36:35 davidxu Exp $"); #include <string.h> #include <sys/types.h> ==== //depot/projects/davidxu_ksedbg/src/lib/libthread_db/src/Makefile#2 (text+ko) ==== @@ -1,4 +1,4 @@ -# $FreeBSD$ +# $FreeBSD: src/lib/libthread_db/src/Makefile,v 1.1 2004/07/15 03:36:35 davidxu Exp $ SHLIB_NAME=libthread_db.so.1 NOPROFILE=yes @@ -10,5 +10,6 @@ .PATH: ${.CURDIR} SRCS+=thread_db.c +INCS=../include/thread_db.h .include <bsd.lib.mk> ==== //depot/projects/davidxu_ksedbg/src/lib/libthread_db/src/thread_db.c#3 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); +__FBSDID("$FreeBSD: src/lib/libthread_db/src/thread_db.c,v 1.2 2004/07/17 17:09:12 marcel Exp $"); #include <stddef.h> #include <unistd.h> @@ -232,7 +232,7 @@ } td_err_e -td_thr_setgregs(const td_thrhandle_t *th, prgregset_t gregs) +td_thr_setgregs(const td_thrhandle_t *th, const prgregset_t gregs) { td_thragent_t *ta = th->th_ta_p;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200407180312.i6I3Cata071770>