Implement the probe variable. Can be used for example with
authorclaudio <claudio@openbsd.org>
Fri, 12 Nov 2021 16:57:24 +0000 (16:57 +0000)
committerclaudio <claudio@openbsd.org>
Fri, 12 Nov 2021 16:57:24 +0000 (16:57 +0000)
@map[probe] = count();
OK mpi@

usr.sbin/btrace/bt.5
usr.sbin/btrace/bt_parse.y
usr.sbin/btrace/bt_parser.h
usr.sbin/btrace/btrace.c
usr.sbin/btrace/map.c

index 3912c23..f26355c 100644 (file)
@@ -1,4 +1,4 @@
-.\"    $OpenBSD: bt.5,v 1.12 2021/10/03 22:01:48 dv Exp $
+.\"    $OpenBSD: bt.5,v 1.13 2021/11/12 16:57:24 claudio Exp $
 .\"
 .\" Copyright (c) 2019 Martin Pieuchot <mpi@openbsd.org>
 .\"
@@ -14,7 +14,7 @@
 .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 .\"
-.Dd $Mdocdate: October 3 2021 $
+.Dd $Mdocdate: November 12 2021 $
 .Dt BT 5
 .Os
 .Sh NAME
@@ -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 f519efd..dd4b0c4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bt_parse.y,v 1.44 2021/10/03 22:01:48 dv Exp $        */
+/*     $OpenBSD: bt_parse.y,v 1.45 2021/11/12 16:57:24 claudio Exp $   */
 
 /*
  * Copyright (c) 2019-2021 Martin Pieuchot <mpi@openbsd.org>
@@ -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 6ba180c..4c6165d 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bt_parser.h,v 1.21 2021/10/03 22:01:48 dv Exp $       */
+/*     $OpenBSD: bt_parser.h,v 1.22 2021/11/12 16:57:24 claudio Exp $  */
 
 /*
  * Copyright (c) 2019-2021 Martin Pieuchot <mpi@openbsd.org>
@@ -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 899ac24..87fc5c1 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: btrace.c,v 1.59 2021/10/24 14:18:58 mpi Exp $ */
+/*     $OpenBSD: btrace.c,v 1.60 2021/11/12 16:57:24 claudio Exp $ */
 
 /*
  * Copyright (c) 2019 - 2021 Martin Pieuchot <mpi@openbsd.org>
@@ -256,6 +256,18 @@ read_btfile(const char *filename, size_t *len)
        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, const char *func, const char *name)
        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 *dtev)
        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 *dtev)
 {
        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 *dtev)
                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 9ec0fa3..d2afab1 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: map.c,v 1.17 2021/09/09 06:58:39 mpi Exp $ */
+/*     $OpenBSD: map.c,v 1.18 2021/11/12 16:57:24 claudio Exp $ */
 
 /*
  * Copyright (c) 2020 Martin Pieuchot <mpi@openbsd.org>
@@ -144,6 +144,7 @@ map_insert(struct map *map, const char *key, struct bt_arg *bval,
        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;