13955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng/*
23955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * Copyright (C) 2013 The Android Open Source Project
33955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng *
43955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * Licensed under the Apache License, Version 2.0 (the "License");
53955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * you may not use this file except in compliance with the License.
63955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * You may obtain a copy of the License at
73955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng *
83955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng *      http://www.apache.org/licenses/LICENSE-2.0
93955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng *
103955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * Unless required by applicable law or agreed to in writing, software
113955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * distributed under the License is distributed on an "AS IS" BASIS,
123955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * See the License for the specific language governing permissions and
143955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * limitations under the License.
153955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng */
163955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
173955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#ifndef _LIBTHREAD_DB__THREAD_DB_H
183955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#define _LIBTHREAD_DB__THREAD_DB_H
193955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
203955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#include <pthread.h>
213955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#include <signal.h>
223955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#include <stdint.h>
233955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#include <sys/types.h>
243955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
253955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef void *psaddr_t;
263955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#define HAVE_PSADDR_T 1
273955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
283955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef pid_t lwpid_t;
293955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#define HAVE_LWPID_T 1
303955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
313955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#define TD_THR_ANY_USER_FLAGS       0xffffffff
323955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#define TD_THR_LOWEST_PRIORITY      -20
333955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#define TD_SIGNO_MASK               NULL
343955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
353955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng/* td_err_e values */
363955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengenum {
373955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_OK,
383955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_ERR,
393955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_NOTHR,
403955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_NOSV,
413955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_NOLWP,
423955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_BADPH,
433955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_BADTH,
443955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_BADSH,
453955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_BADTA,
463955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_BADKEY,
473955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_NOMSG,
483955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_NOFPREGS,
493955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_NOLIBTHREAD,
503955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_NOEVENT,
513955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_NOCAPAB,
523955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_DBERR,
533955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_NOAPLIC,
543955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_NOTSD,
553955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_MALLOC,
563955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_PARTIALREG,
573955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_NOXREGS,
583955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_VERSION
593955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng};
603955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
613955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng/*
623955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * td_event_e values
633955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng * NOTE: There is a max of 32 events
643955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng */
653955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengenum {
663955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_CREATE,
673955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_DEATH
683955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng};
693955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
703955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng/* td_thr_state_e values */
713955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengenum {
723955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_THR_ANY_STATE,
733955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_THR_UNKNOWN,
743955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_THR_SLEEP,
753955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    TD_THR_ZOMBIE
763955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng};
773955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
783955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef int32_t td_err_e;
793955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef uint32_t td_event_e;
803955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef uint32_t td_notify_e;
813955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef uint32_t td_thr_state_e;
823955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef pthread_t thread_t;
833955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
843955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef struct
853955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng{
863955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    pid_t pid;
873955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    struct ps_prochandle *ph;
883955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng} td_thragent_t;
893955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
903955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef struct
913955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng{
923955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    pid_t pid;
933955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    pid_t tid;
943955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng} td_thrhandle_t;
953955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
963955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef struct
973955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng{
983955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    td_event_e event;
993955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    td_thrhandle_t const * th_p;
1003955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    union {
1013955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng        void * data;
1023955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    } msg;
1033955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng} td_event_msg_t;
1043955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1053955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef struct
1063955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng{
1073955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    uint32_t events;
1083955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng} td_thr_events_t;
1093955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1103955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef struct
1113955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng{
1123955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    union {
1133955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng        void * bptaddr;
1143955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    } u;
1153955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng} td_notify_t;
1163955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1173955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef struct
1183955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng{
1193955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    td_thr_state_e ti_state;
1203955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    thread_t ti_tid; // pthread's id for the thread
1213955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    int32_t ti_lid; // the kernel's id for the thread
1223955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng} td_thrinfo_t;
1233955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1243955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1253955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#define td_event_emptyset(set) \
1263955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    (set)->events = 0
1273955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1283955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#define td_event_fillset(set) \
1293955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    (set)->events = 0xffffffff
1303955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1313955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#define td_event_addset(set, n) \
1323955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng    (set)->events |= (1 << n)
1333955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1343955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1353955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengtypedef int td_thr_iter_f(td_thrhandle_t const *, void *);
1363955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1373955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1383955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengstruct ps_prochandle;
1393955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1403955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#ifdef __cplusplus
1413955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern "C"{
1423955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#endif
1433955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1443955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_ta_new(struct ps_prochandle * proc_handle, td_thragent_t ** thread_agent);
1453955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1463955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_ta_delete(td_thragent_t * ta);
1473955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1483955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_ta_set_event(td_thragent_t const * agent, td_thr_events_t * event);
1493955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1503955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_ta_event_addr(td_thragent_t const * agent, td_event_e event, td_notify_t * notify);
1513955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1523955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_ta_clear_event(const td_thragent_t * ta_arg,
1533955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng				  td_thr_events_t * event);
1543955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1553955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_ta_event_getmsg(td_thragent_t const * agent, td_event_msg_t * event);
1563955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1573955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_ta_map_lwp2thr(td_thragent_t const * agent, lwpid_t lwpid,
1583955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng				  td_thrhandle_t *th);
1593955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1603955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_thr_get_info(td_thrhandle_t const * handle,
1613955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng				td_thrinfo_t * info);
1623955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1633955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_thr_event_enable(td_thrhandle_t const * handle,
1643955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng				    td_event_e event);
1653955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1663955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_ta_thr_iter(td_thragent_t const * agent, td_thr_iter_f * func, void * cookie,
1673955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng                               td_thr_state_e state, int32_t prio, sigset_t * sigmask, uint32_t user_flags);
1683955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1693955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern char const ** td_symbol_list(void);
1703955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1713955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_thr_event_enable(td_thrhandle_t const * handle, td_event_e event);
1723955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1733955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_thr_get_info(td_thrhandle_t const * handle, td_thrinfo_t * info);
1743955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1753955f0de839d4bc65b4ff0605d3033f6f0168eceBen Chengextern td_err_e td_thr_tls_get_addr(const td_thrhandle_t * th,
1763955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng				    psaddr_t map_address, size_t offset,
1773955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng				    psaddr_t * address);
1783955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1793955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#ifdef __cplusplus
1803955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng}
1813955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#endif
1823955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng
1833955f0de839d4bc65b4ff0605d3033f6f0168eceBen Cheng#endif
184