const char *sdt_prefix = "__dtrace_probe_";
static int sdt_probe_set(sdt_probedesc_t *sdp, char *name, char *func,
- uintptr_t addr, asm_instr_t **paddr)
+ uintptr_t addr, asm_instr_t **paddr,\
+ sdt_probedesc_t *prv)
{
if ((sdp->sdpd_name = kstrdup(name, GFP_KERNEL)) == NULL) {
kfree(sdp);
}
sdp->sdpd_offset = addr;
+ sdp->sdpd_next = NULL;
*paddr = (asm_instr_t *)addr;
+ if (prv && strcmp(prv->sdpd_name, sdp->sdpd_name) == 0
+ && strcmp(prv->sdpd_func, sdp->sdpd_func) == 0)
+ prv->sdpd_next = sdp;
+
return 0;
}
char *func = pi->name + pi->name_len + 1;
if (sdt_probe_set(&sdps[cnt], pi->name, func, pi->addr,
- &addrs[cnt]))
+ &addrs[cnt],
+ cnt > 0 ? &sdps[cnt - 1] : NULL))
pr_warning("%s: failed to add SDT probe %s\n",
__func__, pi->name);
else
for (i = 1; i <= NF; i++) {
prb = $i;
- pn = fun":"prb;
- ad = addl(baseaddr, poffst[pn]);
-
- if (arch == "x86" || arch == "x86_64")
- ad = subl(ad, 1);
-
- if (lfn != "kmod") {
- printf "\tPTR\t0x%s\n", ad;
- printf "\tPTR\t%d\n", length(prb);
- printf "\tPTR\t%d\n", length(fun);
- printf "\t.asciz\t\042%s\042\n", prb;
- printf "\t.asciz\t\042%s\042\n", fun;
- print "\tALGN";
- } else {
- if (probec == 0)
- print "static sdt_probedesc_t\t_sdt_probes[] = {";
+ pn = fun ":" prb;
+
+ for (j = 0; j < pidcnt[pn]; j++) {
+ pid = pn"-"j;
+ ad = addl(baseaddr, poffst[pid]);
+
+ if (arch == "x86" || arch == "x86_64")
+ ad = subl(ad, 1);
+
+ if (lfn != "kmod") {
+ printf "\tPTR\t0x%s\n", ad;
+ printf "\tPTR\t%d\n", length(prb);
+ printf "\tPTR\t%d\n", length(fun);
+ printf "\t.asciz\t\042%s\042\n", prb;
+ printf "\t.asciz\t\042%s\042\n", fun;
+ print "\tALGN";
+ } else {
+ if (probec == 0)
+ print "static sdt_probedesc_t\t_sdt_probes[] = {";
+
+ printf " {\042%s\042, \042%s\042, 0x%s },\n", \
+ prb, fun, ad;
+ }
- printf " {\042%s\042, \042%s\042, 0x%s },\n", \
- prb, fun, ad;
+ probec++;
}
-
- probec++;
}
}
sub(/^0+/, "", $2);
pn = fun":"$4;
- probes[fun] = $4 " " probes[fun];
- poffst[pn] = subl($2, addr);
+ if (!pidcnt[pn])
+ probes[fun] = $4 " " probes[fun];
+
+ pid = pn"-"int(pidcnt[pn]);
+ pidcnt[pn]++;
+ poffst[pid] = subl($2, addr);
next;
}