This is something I missed to do easy btrace check like:
syscall:exit:entry,
syscall:fork:entry,
syscall:sigaction:entry,
syscall:execve:entry,
syscall:open:entry { @[probe] = count(); }

This will produce something like this as output:
@[syscall:open:entry]: 844
@[syscall:sigaction:entry]: 480
@[syscall:execve:entry]: 27
@[syscall:exit:entry]: 26
@[syscall:fork:entry]: 24

Works for me. I decided to qsort the dt_dtpis array so that bsearch can be
used for quick lookups by id. If the kernel ensures that the returned
array from the ioctl is always sorted this could be skipped.

-- 
:wq Claudio


Index: bt.5
===================================================================
RCS file: /cvs/src/usr.sbin/btrace/bt.5,v
retrieving revision 1.12
diff -u -p -r1.12 bt.5
--- bt.5        3 Oct 2021 22:01:48 -0000       1.12
+++ bt.5        12 Nov 2021 14:05:16 -0000
@@ -105,6 +105,8 @@ Kernel stack of the current thread.
 Timestamp of the event in nanoseconds.
 .It Va pid
 Process ID of the current thread.
+.It Va probe
+Full name of the probe.
 .It Va retval
 Return value of the traced syscall.
 .It Va tid
Index: bt_parse.y
===================================================================
RCS file: /cvs/src/usr.sbin/btrace/bt_parse.y,v
retrieving revision 1.44
diff -u -p -r1.44 bt_parse.y
--- bt_parse.y  3 Oct 2021 22:01:48 -0000       1.44
+++ bt_parse.y  12 Nov 2021 13:46:22 -0000
@@ -717,6 +717,7 @@ lookup(char *s)
                { "pid",        BUILTIN,        B_AT_BI_PID },
                { "print",      F_PRINT,        B_AC_PRINT },
                { "printf",     FUNCN,          B_AC_PRINTF },
+               { "probe",      BUILTIN,        B_AT_BI_PROBE },
                { "retval",     BUILTIN,        B_AT_BI_RETVAL },
                { "str",        STR,            B_AT_FN_STR },
                { "sum",        MOP1,           B_AT_MF_SUM },
Index: bt_parser.h
===================================================================
RCS file: /cvs/src/usr.sbin/btrace/bt_parser.h,v
retrieving revision 1.21
diff -u -p -r1.21 bt_parser.h
--- bt_parser.h 3 Oct 2021 22:01:48 -0000       1.21
+++ bt_parser.h 12 Nov 2021 13:12:43 -0000
@@ -147,6 +147,7 @@ struct bt_arg {
                B_AT_BI_ARG9,
                B_AT_BI_ARGS,
                B_AT_BI_RETVAL,
+               B_AT_BI_PROBE,
 
                B_AT_FN_STR,                    /* str($1); str($1, 3); */
 
Index: btrace.c
===================================================================
RCS file: /cvs/src/usr.sbin/btrace/btrace.c,v
retrieving revision 1.59
diff -u -p -r1.59 btrace.c
--- btrace.c    24 Oct 2021 14:18:58 -0000      1.59
+++ btrace.c    12 Nov 2021 13:55:52 -0000
@@ -256,6 +256,18 @@ read_btfile(const char *filename, size_t
        return fcontent;
 }
 
+static int
+dtpi_cmp(const void *a, const void *b)
+{
+       const struct dtioc_probe_info *ai = a, *bi = b;
+
+       if (ai->dtpi_pbn > bi->dtpi_pbn)
+               return 1;
+       if (ai->dtpi_pbn < bi->dtpi_pbn)
+               return -1;
+       return 0;
+}
+
 void
 dtpi_cache(int fd)
 {
@@ -276,6 +288,8 @@ dtpi_cache(int fd)
        dtpr.dtpr_probes = dt_dtpis;
        if (ioctl(fd, DTIOCGPLIST, &dtpr))
                err(1, "DTIOCGPLIST");
+
+       qsort(dt_dtpis, dt_ndtpi, sizeof(*dt_dtpis), dtpi_cmp);
 }
 
 void
@@ -351,6 +365,15 @@ dtpi_get_by_value(const char *prov, cons
        return NULL;
 }
 
+static struct dtioc_probe_info *
+dtpi_get_by_id(unsigned int pbn)
+{
+       struct dtioc_probe_info d;
+
+       d.dtpi_pbn = pbn;
+       return bsearch(&d, dt_dtpis, dt_ndtpi, sizeof(*dt_dtpis), dtpi_cmp);
+}
+
 void
 rules_do(int fd)
 {
@@ -1263,6 +1286,8 @@ ba_name(struct bt_arg *ba)
                return "args";
        case B_AT_BI_RETVAL:
                return "retval";
+       case B_AT_BI_PROBE:
+               return "probe";
        case B_AT_FN_STR:
                return "str";
        case B_AT_OP_PLUS:
@@ -1372,6 +1397,9 @@ ba2long(struct bt_arg *ba, struct dt_evt
        case B_AT_BI_RETVAL:
                val = dtev->dtev_retval[0];
                break;
+       case B_AT_BI_PROBE:
+               val = dtev->dtev_pbn;
+               break;
        case B_AT_OP_PLUS ... B_AT_OP_LOR:
                val = baexpr2long(ba, dtev);
                break;
@@ -1390,6 +1418,7 @@ ba2str(struct bt_arg *ba, struct dt_evt 
 {
        static char buf[STRLEN];
        struct bt_var *bv;
+       struct dtioc_probe_info *dtpi;
        const char *str;
 
        buf[0] = '\0';
@@ -1436,6 +1465,15 @@ ba2str(struct bt_arg *ba, struct dt_evt 
                snprintf(buf, sizeof(buf), "%ld", (long)dtev->dtev_retval[0]);
                str = buf;
                break;
+       case B_AT_BI_PROBE:
+               dtpi = dtpi_get_by_id(dtev->dtev_pbn);
+               if (dtpi != NULL)
+                       snprintf(buf, sizeof(buf), "%s:%s:%s",
+                           dtpi->dtpi_prov, dtpi_func(dtpi), dtpi->dtpi_name);
+               else
+                       snprintf(buf, sizeof(buf), "%u", dtev->dtev_pbn);
+               str = buf;
+               break;
        case B_AT_MAP:
                bv = ba->ba_value;
                /* Unitialized map */
@@ -1510,6 +1548,7 @@ ba2dtflags(struct bt_arg *ba)
                        flags |= DTEVT_FUNCARGS;
                        break;
                case B_AT_BI_RETVAL:
+               case B_AT_BI_PROBE:
                        break;
                case B_AT_MF_COUNT:
                case B_AT_MF_MAX:
Index: map.c
===================================================================
RCS file: /cvs/src/usr.sbin/btrace/map.c,v
retrieving revision 1.17
diff -u -p -r1.17 map.c
--- map.c       9 Sep 2021 06:58:39 -0000       1.17
+++ map.c       12 Nov 2021 13:18:11 -0000
@@ -144,6 +144,7 @@ map_insert(struct map *map, const char *
        case B_AT_BI_NSECS:
        case B_AT_BI_ARG0 ... B_AT_BI_ARG9:
        case B_AT_BI_RETVAL:
+       case B_AT_BI_PROBE:
                free(mep->mval);
                mep->mval = ba_new(ba2long(bval, dtev), B_AT_LONG);
                break;

Reply via email to