|
@@ -696,8 +696,16 @@ out_err:
|
|
|
#ifdef HAVE_GELF_GETNOTE_SUPPORT
|
|
|
static unsigned long long sdt_note__get_addr(struct sdt_note *note)
|
|
|
{
|
|
|
- return note->bit32 ? (unsigned long long)note->addr.a32[0]
|
|
|
- : (unsigned long long)note->addr.a64[0];
|
|
|
+ return note->bit32 ?
|
|
|
+ (unsigned long long)note->addr.a32[SDT_NOTE_IDX_LOC] :
|
|
|
+ (unsigned long long)note->addr.a64[SDT_NOTE_IDX_LOC];
|
|
|
+}
|
|
|
+
|
|
|
+static unsigned long long sdt_note__get_ref_ctr_offset(struct sdt_note *note)
|
|
|
+{
|
|
|
+ return note->bit32 ?
|
|
|
+ (unsigned long long)note->addr.a32[SDT_NOTE_IDX_REFCTR] :
|
|
|
+ (unsigned long long)note->addr.a64[SDT_NOTE_IDX_REFCTR];
|
|
|
}
|
|
|
|
|
|
static const char * const type_to_suffix[] = {
|
|
@@ -775,14 +783,21 @@ static char *synthesize_sdt_probe_command(struct sdt_note *note,
|
|
|
{
|
|
|
struct strbuf buf;
|
|
|
char *ret = NULL, **args;
|
|
|
- int i, args_count;
|
|
|
+ int i, args_count, err;
|
|
|
+ unsigned long long ref_ctr_offset;
|
|
|
|
|
|
if (strbuf_init(&buf, 32) < 0)
|
|
|
return NULL;
|
|
|
|
|
|
- if (strbuf_addf(&buf, "p:%s/%s %s:0x%llx",
|
|
|
- sdtgrp, note->name, pathname,
|
|
|
- sdt_note__get_addr(note)) < 0)
|
|
|
+ err = strbuf_addf(&buf, "p:%s/%s %s:0x%llx",
|
|
|
+ sdtgrp, note->name, pathname,
|
|
|
+ sdt_note__get_addr(note));
|
|
|
+
|
|
|
+ ref_ctr_offset = sdt_note__get_ref_ctr_offset(note);
|
|
|
+ if (ref_ctr_offset && err >= 0)
|
|
|
+ err = strbuf_addf(&buf, "(0x%llx)", ref_ctr_offset);
|
|
|
+
|
|
|
+ if (err < 0)
|
|
|
goto error;
|
|
|
|
|
|
if (!note->args)
|
|
@@ -998,6 +1013,7 @@ int probe_cache__show_all_caches(struct strfilter *filter)
|
|
|
enum ftrace_readme {
|
|
|
FTRACE_README_PROBE_TYPE_X = 0,
|
|
|
FTRACE_README_KRETPROBE_OFFSET,
|
|
|
+ FTRACE_README_UPROBE_REF_CTR,
|
|
|
FTRACE_README_END,
|
|
|
};
|
|
|
|
|
@@ -1009,6 +1025,7 @@ static struct {
|
|
|
[idx] = {.pattern = pat, .avail = false}
|
|
|
DEFINE_TYPE(FTRACE_README_PROBE_TYPE_X, "*type: * x8/16/32/64,*"),
|
|
|
DEFINE_TYPE(FTRACE_README_KRETPROBE_OFFSET, "*place (kretprobe): *"),
|
|
|
+ DEFINE_TYPE(FTRACE_README_UPROBE_REF_CTR, "*ref_ctr_offset*"),
|
|
|
};
|
|
|
|
|
|
static bool scan_ftrace_readme(enum ftrace_readme type)
|
|
@@ -1064,3 +1081,8 @@ bool kretprobe_offset_is_supported(void)
|
|
|
{
|
|
|
return scan_ftrace_readme(FTRACE_README_KRETPROBE_OFFSET);
|
|
|
}
|
|
|
+
|
|
|
+bool uprobe_ref_ctr_is_supported(void)
|
|
|
+{
|
|
|
+ return scan_ftrace_readme(FTRACE_README_UPROBE_REF_CTR);
|
|
|
+}
|