42 post_handler,handler_data,0,1);
52 char *
name,
const char *delim,
61 verror(
"could not find symbol %s!\n",name);
77 int force_at_entry,
int noabort,
88 unsigned char *funccode = NULL;
96 GHashTable *absolute_branch_targets = NULL;
99 ADDR jaddr,jlow,jhigh;
100 struct bsymbol *jbsymbol;
104 symbol = lsymbol_last_symbol(bsymbol->
lsymbol);
107 verror(
"must supply a function symbol!\n");
113 &start,&end,NULL,&alt_start,NULL)) {
114 verror(
"could not resolve entry PC for function %s!\n",
118 else if (!force_at_entry && alt_start)
119 probeaddr = alt_start;
135 funclen = end - start;
138 verror(
"could not load code for disasm of %s!\n",
162 "registered entry addr probe at %s%+d\n",
188 absolute_branch_targets =
189 g_hash_table_new(g_direct_hash,g_direct_equal);
192 &cflist,start,noabort)) {
202 for (j = 0; j < array_list_len(cflist); ++j) {
203 idata = (
struct cf_inst_data *)array_list_item(cflist,j);
209 if (!g_hash_table_lookup(absolute_branch_targets,
210 (gpointer)(uintptr_t)idata->
cf.
target))
211 g_hash_table_insert(absolute_branch_targets,
212 (gpointer)(uintptr_t)idata->
cf.
target,
218 verror(
"disasm instr was not RET/IRET!\n");
228 probeaddr = start + idata->
offset;
241 "registered return addr probe at %s%+d\n",
246 array_list_deep_free(cflist);
255 if (!absolute_branch_targets
256 || !g_hash_table_size(absolute_branch_targets))
259 g_hash_table_iter_init(&iter,absolute_branch_targets);
260 while (g_hash_table_iter_next(&iter,&kp,&vp)) {
262 if (vp == (gpointer)0x1UL) {
275 jaddr = (
ADDR)(uintptr_t)kp;
278 vwarn(
"could not find symbol for jumped-to addr 0x%"PRIxADDR";"
279 " trying safe disasm range lookup\n",jaddr);
282 verror(
"could not find safe disasm range for jumped-to"
290 &jlow,&jhigh,NULL,NULL,NULL)) {
291 verror(
"could not resolve base addr function %s!\n",
304 funclen = jhigh - jlow;
316 &cflist,jlow,noabort)) {
326 for (j = 0; j < array_list_len(cflist); ++j) {
327 idata = (
struct cf_inst_data *)array_list_item(cflist,j);
333 if (!g_hash_table_lookup(absolute_branch_targets,
334 (gpointer)(uintptr_t)idata->
cf.
target))
336 g_hash_table_insert(absolute_branch_targets,
337 (gpointer)(uintptr_t)idata->
cf.
target,
343 verror(
"disasm instr was not RET/IRET!\n");
349 snprintf(buf,
sizeof(buf),
"%s_jmpto_exit_%d",
352 snprintf(buf,
sizeof(buf),
"0x%"PRIxADDR"_jmpto_exit_%d",
358 probeaddr = jlow + idata->
offset;
372 "registered jumped-to return addr probe at %s+%d\n",
376 "registered jumped-to return addr probe at"
382 array_list_deep_free(cflist);
387 g_hash_table_insert(absolute_branch_targets,kp,(gpointer)0x1UL);
390 if (absolute_branch_targets)
391 g_hash_table_destroy(absolute_branch_targets);
398 if (absolute_branch_targets)
399 g_hash_table_destroy(absolute_branch_targets);
400 if (funccode && caller_free)
403 array_list_deep_free(cflist);
411 struct probe *probe_register_function_invocations(
struct probe *probe,
413 struct bsymbol *caller,
414 struct bsymbol *callee,
416 struct target *target;
422 unsigned int caller_len;
423 unsigned char *funccode = NULL;
425 ADDR callee_start = 0;
426 ADDR callee_inlined_start;
427 ADDR callee_inlined_end;
428 GSList *callee_instances = NULL;
429 struct symbol *caller_symbol;
430 struct symbol *callee_symbol;
432 struct probe *iprobe;
439 struct symbol *isymbol;
443 struct bsymbol *bsymbol;
458 verror(
"caller and callee must be function symbols!\n");
464 &caller_start,&caller_end,NULL,
466 verror(
"could not resolve base addr for caller function %s!\n",
474 verror(
"could not find range for addr 0x%"PRIxADDR"\n",caller_start);
478 caller_len = caller_end - caller_start;
485 &callee_start,NULL,NULL,NULL,NULL)) {
486 vwarn(
"could not resolve base addr for callee function %s!\n",
496 if (csii && csii->inline_instances) {
504 &callee_inlined_start,
505 &callee_inlined_end,NULL,NULL,NULL)) {
506 verror(
"could not resolve base addr for callee inline instance!\n");
512 if (!(caller_start <= callee_inlined_start
513 && callee_inlined_start <= caller_end
514 && caller_start <= callee_inlined_end
515 && callee_inlined_end <= caller_end))
521 verror(
"could not create lsymbol for inline instance symbol %s!\n",
527 iii =
calloc(1,
sizeof(*iii));
529 iii->start = callee_inlined_start;
530 iii->end = callee_inlined_end;
532 callee_instances = g_slist_append(callee_instances,iii);
537 if (!callee_start || !callee_instances) {
538 verror(
"callee function %s has no addr, and/or is not inlined in"
539 " caller function %s!\n",
545 funccode =
target_load_code(target,caller_start,caller_len,0,0,&caller_free);
547 verror(
"could not load code for disasm of %s!\n",
554 &cf_idata_list,caller_start,noabort)) {
555 verror(
"could not disasm caller function %s!\n",
565 for (j = 0; j < array_list_len(cf_idata_list); ++j) {
566 idata = (
struct cf_inst_data *)array_list_item(cf_idata_list,j);
569 verror(
"disasm instr was not CALL!\n");
573 if (idata->
cf.
target != callee_start)
578 snprintf(namebuf,
sizeof(namebuf),
"%s__pre_invoke__%s__%i",
583 probeaddr = caller_start + idata->
offset;
594 probes = g_slist_append(probes,iprobe);
599 snprintf(namebuf,
sizeof(namebuf),
"%s__post_invoke__%s__%i",
604 probeaddr = caller_start + idata->
offset + idata->
size;
615 probes = g_slist_append(probes,iprobe);
619 "registered invocation probes around call site 0x%"PRIxADDR"\n",
620 caller_start + idata->
offset);
624 array_list_deep_free(cf_idata_list);
625 cf_idata_list = NULL;
629 if (callee_instances) {
634 snprintf(namebuf,
sizeof(namebuf),
"%s__pre_inline_invoke__%s__%i",
639 probeaddr = iii->start;
644 " (inline call site %d)\n",
650 probes = g_slist_append(probes,iprobe);
655 snprintf(namebuf,
sizeof(namebuf),
"%s__post_inline_invoke__%s__%i",
660 probeaddr = iii->end;
671 probes = g_slist_append(probes,iprobe);
675 "registered inline invocation probes around call site"
677 iii->start,iii->end);
686 g_slist_free(callee_instances);
697 verror(
"could not register probe %s on source %s; cannot abort!\n",
703 g_slist_free(probes);
716 g_slist_free(probes);
718 if (callee_instances) {
723 g_slist_free(callee_instances);
725 if (funccode && caller_free)
728 array_list_deep_free(cf_idata_list);
736 struct probe *probe_register_function_instrs(
struct bsymbol *bsymbol,
739 probe_register_disasm_handler_t handler,
742 struct probe *probe,...) {
744 struct target *target = probe->
target;
750 struct probe *source;
753 unsigned char *funccode = NULL;
754 unsigned int funclen;
758 GHashTable *itypes = NULL;
761 struct probe *probe_alt;
763 int sname_created = 0;
764 struct symbol *symbol;
770 verror(
"must supply a function symbol!\n");
776 sname =
malloc(
sizeof(
"ref0x")+12);
788 &start,&end,NULL,NULL,NULL)) {
789 verror(
"could not resolve base addr for function %s!\n",
795 funclen = end - start;
809 itypes = g_hash_table_new(g_direct_hash,g_direct_equal);
810 g_hash_table_insert(itypes,(gpointer)inst,probe);
814 probe = va_arg(ap,
struct probe *);
815 g_hash_table_insert(itypes,(gpointer)inst,probe);
826 funccode =
malloc(funclen + 1);
829 verror(
"could not read code before disasm of function %s!\n",sname);
833 funccode[funclen] = 0;
836 &cflist,start,noabort)) {
837 verror(
"could not disasm function %s!\n",sname);
845 for (j = 0; j < array_list_len(cflist); ++j) {
846 idata = (
struct cf_inst_data *)array_list_item(cflist,j);
853 || range != newrange)) {
854 verror(
"could not find sane range!\n");
866 if (handler && handler(idata,start + idata->
offset,
867 handler_data,&probe_alt) == 0) {
877 probe = (
struct probe *) \
878 g_hash_table_lookup(itypes,(gpointer)idata->
type);
885 bufsiz = strlen(sname)+1+16+1+11+1;
886 bufsiz = strlen(sname)+1+16+1+11+1;
894 probeaddr = start + idata->
offset;
899 source->
name,probeaddr);
904 verror(
"could not register probe %s on source %s!\n",
911 "registered %s probe at %s%+d\n",
916 array_list_deep_free(cflist);
920 g_hash_table_destroy(itypes);
930 g_hash_table_destroy(itypes);
934 array_list_deep_free(cflist);
945 struct probe *probe_register_block_instrs(
struct target *target,
949 probe_register_disasm_handler_t handler,
952 struct probe *probe,...) {
956 struct probe *source;
959 unsigned char *funccode = NULL;
963 GHashTable *itypes = NULL;
966 struct probe *probe_alt;
967 char sname[
sizeof(
ADDR)*2 + 2 + 1];
970 snprintf(sname,
sizeof(sname),
"0x%"PRIxADDR,start);
982 itypes = g_hash_table_new(g_direct_hash,g_direct_equal);
983 g_hash_table_insert(itypes,(gpointer)inst,probe);
987 probe = va_arg(ap,
struct probe *);
988 g_hash_table_insert(itypes,(gpointer)inst,probe);
997 &cflist,start,noabort)) {
998 verror(
"could not disasm function %s!\n",sname);
1007 for (j = 0; j < array_list_len(cflist); ++j) {
1008 idata = (
struct cf_inst_data *)array_list_item(cflist,j);
1015 if (handler && handler(idata,start + idata->
offset,
1016 handler_data,&probe_alt) == 0) {
1026 probe = (
struct probe *) \
1027 g_hash_table_lookup(itypes,(gpointer)idata->
type);
1034 bufsiz = strlen(sname)+1+16+1+11+1;
1035 bufsiz = strlen(sname)+1+16+1+11+1;
1043 probeaddr = start + idata->
offset;
1048 source->
name,probeaddr);
1053 verror(
"could not register probe %s on source %s!\n",
1060 "registered %s probe at %s%+d\n",
1065 array_list_deep_free(cflist);
1069 g_hash_table_destroy(itypes);
1075 g_hash_table_destroy(itypes);
1079 array_list_deep_free(cflist);
1090 struct bsymbol *bsymbol,
1095 struct target *target = probe->
target;
1096 struct symbol *symbol;
1097 struct probe *pcprobe = NULL;
1098 struct probe *cprobe;
1101 GSList *cprobes = NULL;
1103 struct symbol *isymbol;
1111 verror(
"cannot probe a non-instance symbol!\n");
1121 &paddr,NULL,NULL,NULL,NULL)) {
1133 verror(
"could not register probe %s!\n",pcprobe->
name);
1144 verror(
"could not register probe %s on source %s!\n",
1158 if (sii && sii->inline_instances) {
1163 verror(
"could not create lsymbol for inline instance symbol %s!\n",
1174 verror(
"could not register probe %s!\n",cprobe->
name);
1181 snprintf(buf,bufsiz,
"%s_inline_at_0x%"PRIxADDR,
1191 verror(
"could not register probe %s on source %s!\n",
1200 cprobes = g_slist_append(cprobes,cprobe);
1205 g_slist_free(cprobes);
1226 g_slist_free(cprobes);
struct bsymbol * bsymbol_create(struct lsymbol *lsymbol, struct memregion *region)
result_t pre_handler(struct probe *probe, tid_t tid, void *data, struct probe *trigger, struct probe *base)
int probe_unregister(struct probe *probe, int force)
probe_handler_t pre_handler
#define INST_TO_CF_FLAG(inst)
struct probe * probe_simple(struct target *target, tid_t tid, char *name, probe_handler_t pre_handler, probe_handler_t post_handler, void *handler_data)
struct probe * __probe_register_addr(struct probe *probe, ADDR addr, struct memrange *range, probepoint_type_t type, probepoint_style_t style, probepoint_whence_t whence, probepoint_watchsize_t watchsize, struct bsymbol *bsymbol, ADDR symbol_addr)
struct lsymbol * lsymbol_create_from_symbol__int(struct symbol *symbol)
int target_lsymbol_resolve_bounds(struct target *target, struct target_location_ctxt *tlctxt, struct lsymbol *lsymbol, ADDR base_addr, ADDR *start, ADDR *end, int *is_noncontiguous, ADDR *alt_start, ADDR *alt_end)
struct bsymbol * target_lookup_sym(struct target *target, const char *name, const char *delim, char *srcfile, symbol_type_flag_t ftype)
#define v_g_slist_foreach(gslhead, gslcur, elm)
struct target_location_ctxt * target_location_ctxt_create_from_bsymbol(struct target *target, tid_t tid, struct bsymbol *bsymbol)
#define SYMBOL_IS_INSTANCE(sym)
result_t probe_do_sink_post_handlers(struct probe *probe, tid_t tid, void *handler_data, struct probe *trigger, struct probe *base)
char * bsymbol_get_name(struct bsymbol *bsymbol)
#define verror(format,...)
result_t probe_do_sink_pre_handlers(struct probe *probe, tid_t tid, void *handler_data, struct probe *trigger, struct probe *base)
unsigned char * target_read_addr(struct target *target, ADDR addr, unsigned long length, unsigned char *buf)
int target_find_memory_real(struct target *target, ADDR addr, struct addrspace **space_saveptr, struct memregion **region_saveptr, struct memrange **range_saveptr)
result_t(* probe_handler_t)(struct probe *probe, tid_t tid, void *handler_data, struct probe *trigger, struct probe *base)
#define vwarn(format,...)
int disasm_get_control_flow_offsets(struct target *target, inst_cf_flags_t flags, unsigned char *inst_buf, unsigned int buf_len, struct array_list **offset_list, ADDR base, int noabort)
ADDR probe_addr(struct probe *probe)
struct probe * probe_register_source(struct probe *sink, struct probe *src)
REFCNT bsymbol_release(struct bsymbol *bsymbol)
#define SYMBOL_RX_INLINE(sym, rvar)
int probe_free(struct probe *probe, int force)
int target_symbol_resolve_bounds(struct target *target, struct target_location_ctxt *tlctxt, struct symbol *symbol, ADDR *start, ADDR *end, int *is_noncontiguous, ADDR *alt_start, ADDR *alt_end)
#define DWDEBUG_DEF_DELIM
struct probe * probe_register_inlined_symbol(struct probe *probe, struct bsymbol *bsymbol, int do_primary, probepoint_style_t style, probepoint_whence_t whence, probepoint_watchsize_t watchsize)
struct bsymbol * target_lookup_sym_addr(struct target *target, ADDR addr)
struct probe * probe_create(struct target *target, tid_t tid, struct probe_ops *pops, const char *name, probe_handler_t pre_handler, probe_handler_t post_handler, void *handler_data, int autofree, int tracked)
struct target_thread * thread
#define vdebug(devel, areas, flags, format,...)
struct probe * probe_register_symbol_name(struct probe *probe, char *name, const char *delim, probepoint_style_t style, probepoint_whence_t whence, probepoint_watchsize_t watchsize)
const char * disasm_get_inst_name(inst_type_t type)
struct cf_inst_data::@12 cf
void * calloc(size_t nmemb, size_t size)
result_t post_handler(struct probe *probe, tid_t tid, void *data, struct probe *trigger, struct probe *base)
struct target_location_ctxt * target_location_ctxt_create(struct target *target, tid_t tid, struct memregion *region)
struct symbol * bsymbol_get_symbol(struct bsymbol *bsymbol)
void target_location_ctxt_free(struct target_location_ctxt *tlctxt)
char * symbol_get_name(struct symbol *symbol)
void * malloc(size_t size)
void probe_rename(struct probe *probe, const char *name)
int target_lookup_safe_disasm_range(struct target *target, ADDR addr, ADDR *start, ADDR *end, void **data)
char * probe_name(struct probe *probe)
struct probe * probe_register_symbol(struct probe *probe, struct bsymbol *bsymbol, probepoint_style_t style, probepoint_whence_t whence, probepoint_watchsize_t watchsize)
#define SYMBOL_IS_FUNC(sym)
probe_handler_t post_handler
struct memregion * region
unsigned char * target_load_code(struct target *target, ADDR start, unsigned int len, int nocache, int force_copy, int *caller_free)