1/* 2 * Copyright (c) 2004 Marcel Moolenaar 3 * Copyright (c) 2005 David Xu 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: --- 12 unchanged lines hidden (view full) --- 21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 */ 27 28#include <sys/cdefs.h> |
29__FBSDID("$FreeBSD: head/lib/libthread_db/libthr_db.c 181341 2008-08-06 03:14:18Z marcel $"); |
30 31#include <proc_service.h> 32#include <stddef.h> 33#include <stdlib.h> 34#include <string.h> 35#include <sys/types.h> 36#include <sys/linker_set.h> 37#include <sys/ptrace.h> --- 202 unchanged lines hidden (view full) --- 240 241static td_err_e 242pt_ta_map_lwp2thr(const td_thragent_t *ta, lwpid_t lwp, td_thrhandle_t *th) 243{ 244 return (pt_ta_map_id2thr(ta, lwp, th)); 245} 246 247static td_err_e |
248pt_ta_thr_iter(const td_thragent_t *ta, td_thr_iter_f *callback, 249 void *cbdata_p, td_thr_state_e state __unused, int ti_pri __unused, 250 sigset_t *ti_sigmask_p __unused, unsigned int ti_user_flags __unused) |
251{ 252 TAILQ_HEAD(, pthread) thread_list; 253 td_thrhandle_t th; 254 psaddr_t pt; 255 long lwp; 256 int ret; 257 258 TDBG_FUNC(); --- 22 unchanged lines hidden (view full) --- 281 return (P2T(ret)); 282 } 283 return (TD_OK); 284} 285 286static td_err_e 287pt_ta_tsd_iter(const td_thragent_t *ta, td_key_iter_f *ki, void *arg) 288{ |
289 void *keytable; |
290 void *destructor; 291 int i, ret, allocated; 292 293 TDBG_FUNC(); 294 295 keytable = malloc(ta->thread_max_keys * ta->thread_size_key); 296 if (keytable == NULL) 297 return (TD_MALLOC); 298 ret = ps_pread(ta->ph, (psaddr_t)ta->thread_keytable_addr, keytable, 299 ta->thread_max_keys * ta->thread_size_key); 300 if (ret != 0) { 301 free(keytable); 302 return (P2T(ret)); 303 } 304 for (i = 0; i < ta->thread_max_keys; i++) { |
305 allocated = *(int *)(void *)((uintptr_t)keytable + 306 i * ta->thread_size_key + ta->thread_off_key_allocated); 307 destructor = *(void **)(void *)((uintptr_t)keytable + 308 i * ta->thread_size_key + ta->thread_off_key_destructor); |
309 if (allocated) { 310 ret = (ki)(i, destructor, arg); 311 if (ret != 0) { 312 free(keytable); 313 return (TD_DBERR); 314 } 315 } 316 } --- 98 unchanged lines hidden (view full) --- 415 handle.th_thread = pt; 416 msg->th_p = &handle; 417 return (0); 418} 419 420static td_err_e 421pt_dbsuspend(const td_thrhandle_t *th, int suspend) 422{ |
423 const td_thragent_t *ta = th->th_ta; |
424 int ret; 425 426 TDBG_FUNC(); 427 428 ret = pt_validate(th); 429 if (ret) 430 return (ret); 431 --- 223 unchanged lines hidden (view full) --- 655 &mask, sizeof(mask)); 656 return (P2T(ret)); 657} 658 659static td_err_e 660pt_thr_event_getmsg(const td_thrhandle_t *th, td_event_msg_t *msg) 661{ 662 static td_thrhandle_t handle; |
663 const td_thragent_t *ta = th->th_ta; |
664 psaddr_t pt, pt_temp; 665 long lwp; 666 int ret; 667 td_thr_events_e tmp; 668 669 TDBG_FUNC(); 670 pt = th->th_thread; 671 ret = ps_pread(ta->ph, ta->thread_last_event_addr, &pt_temp, sizeof(pt_temp)); --- 24 unchanged lines hidden (view full) --- 696 handle.th_ta = ta; 697 handle.th_tid = lwp; 698 handle.th_thread = pt; 699 msg->th_p = &handle; 700 return (0); 701} 702 703static td_err_e |
704pt_thr_sstep(const td_thrhandle_t *th, int step __unused) |
705{ 706 TDBG_FUNC(); 707 708 return pt_validate(th); 709} 710 711static int 712pt_validate(const td_thrhandle_t *th) --- 81 unchanged lines hidden --- |