[DTrace-devel] [PATCH 11/12] Add support for umod(), usym(), and uaddr()
Kris Van Hees
kris.van.hees at oracle.com
Fri Jun 11 12:52:49 PDT 2021
On Fri, May 28, 2021 at 02:35:15PM -0400, eugene.loh at oracle.com wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
>
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
> ---
> libdtrace/dt_cg.c | 34 ++++++++++++++++++++++++++++++--
> libdtrace/dt_consume.c | 20 +++++++++++++++----
> test/unittest/ustack/tst.uaddr.d | 17 ++++++++++++++++
> test/unittest/ustack/tst.uaddr.r | 1 +
> test/unittest/ustack/tst.ufunc.d | 17 ++++++++++++++++
> test/unittest/ustack/tst.ufunc.r | 1 +
> test/unittest/ustack/tst.umod.d | 17 ++++++++++++++++
> test/unittest/ustack/tst.umod.r | 1 +
> test/unittest/ustack/tst.usym.d | 17 ++++++++++++++++
> test/unittest/ustack/tst.usym.r | 1 +
> 10 files changed, 120 insertions(+), 6 deletions(-)
> create mode 100644 test/unittest/ustack/tst.uaddr.d
> create mode 100644 test/unittest/ustack/tst.uaddr.r
> create mode 100644 test/unittest/ustack/tst.ufunc.d
> create mode 100644 test/unittest/ustack/tst.ufunc.r
> create mode 100644 test/unittest/ustack/tst.umod.d
> create mode 100644 test/unittest/ustack/tst.umod.r
> create mode 100644 test/unittest/ustack/tst.usym.d
> create mode 100644 test/unittest/ustack/tst.usym.r
>
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index 1a88ef35..fb4f623d 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -723,6 +723,7 @@ dt_cg_store_val(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind,
> dt_pfargv_t *pfp, int arg)
> {
> dtrace_diftype_t vtype;
> + dtrace_hdl_t *dtp = pcb->pcb_hdl;
> dt_irlist_t *dlp = &pcb->pcb_ir;
> dt_regset_t *drp = pcb->pcb_regs;
> uint_t off;
> @@ -739,13 +740,42 @@ dt_cg_store_val(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind,
> size = sizeof(dnp->dn_ident->di_id);
> } else {
> dt_cg_node(dnp, &pcb->pcb_ir, drp);
> - dt_node_diftype(pcb->pcb_hdl, dnp, &vtype);
> + dt_node_diftype(dtp, dnp, &vtype);
> size = vtype.dtdt_size;
> }
>
> + if (kind == DTRACEACT_USYM ||
> + kind == DTRACEACT_UMOD ||
> + kind == DTRACEACT_UADDR) {
> + dt_ident_t *idp;
> +
> + off = dt_rec_add(dtp, dt_cg_fill_gap, kind, 16, 8, NULL, arg);
> +
> + /* preface the value with the user process tgid */
> + if (dt_regset_xalloc_args(drp) == -1)
> + longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
> +
> + emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_1, BPF_REG_FP, DT_STK_DCTX));
> + emit(dlp, BPF_MOV_IMM(BPF_REG_2, DIF_VAR_TID));
> + idp = dt_dlib_get_func(dtp, "dt_get_bvar");
> + assert(idp != NULL);
> + dt_regset_xalloc(drp, BPF_REG_0);
> + emite(dlp, BPF_CALL_FUNC(idp->di_id), idp);
> + dt_regset_free_args(drp);
> + dt_cg_check_fault(pcb);
> + emit(dlp, BPF_STORE(BPF_DW, BPF_REG_9, off, BPF_REG_0));
> + dt_regset_free(drp, BPF_REG_0);
See my comments on the ustack() patch and how you should use the BPF helper
directly rather than going through get_bvar().
> +
> + /* then store the value */
> + emit(dlp, BPF_STORE(BPF_DW, BPF_REG_9, off + 8, dnp->dn_reg));
> + dt_regset_free(drp, dnp->dn_reg);
> +
> + return 0;
> + }
> +
> if (dt_node_is_scalar(dnp) || dt_node_is_float(dnp) ||
> dnp->dn_kind == DT_NODE_AGG) {
> - off = dt_rec_add(pcb->pcb_hdl, dt_cg_fill_gap, kind,
> + off = dt_rec_add(dtp, dt_cg_fill_gap, kind,
> size, size, pfp, arg);
>
> assert(size > 0 && size <= 8 && (size & (size - 1)) == 0);
> diff --git a/libdtrace/dt_consume.c b/libdtrace/dt_consume.c
> index 860f83d8..a6c58423 100644
> --- a/libdtrace/dt_consume.c
> +++ b/libdtrace/dt_consume.c
> @@ -1234,9 +1234,9 @@ static int
> dt_print_usym(dtrace_hdl_t *dtp, FILE *fp, caddr_t addr, dtrace_actkind_t act)
> {
> /* LINTED - alignment */
> - uint64_t tgid = ((uint64_t *)addr)[1];
> + uint64_t tgid = ((uint64_t *)addr)[0];
> /* LINTED - alignment */
> - uint64_t pc = ((uint64_t *)addr)[2];
> + uint64_t pc = ((uint64_t *)addr)[1];
> const char *format = " %-50s";
> char *s;
> int n, len = 256;
> @@ -1268,9 +1268,9 @@ int
> dt_print_umod(dtrace_hdl_t *dtp, FILE *fp, const char *format, caddr_t addr)
> {
> /* LINTED - alignment */
> - uint64_t tgid = ((uint64_t *)addr)[1];
> + uint64_t tgid = ((uint64_t *)addr)[0];
> /* LINTED - alignment */
> - uint64_t pc = ((uint64_t *)addr)[2];
> + uint64_t pc = ((uint64_t *)addr)[1];
> int err = 0;
>
> char objname[PATH_MAX], c[PATH_MAX * 2];
> @@ -2088,6 +2088,18 @@ dt_consume_one(dtrace_hdl_t *dtp, FILE *fp, char *buf,
> continue;
> }
>
> + if (act == DTRACEACT_USYM || act == DTRACEACT_UADDR) {
> + if (dt_print_usym(dtp, fp, addr, act) < 0)
> + return -1;
> + continue;
> + }
> +
> + if (act == DTRACEACT_UMOD) {
> + if (dt_print_umod(dtp, fp, NULL, addr) < 0)
> + return -1;
> + continue;
> + }
As commented before, this should be within the switch (act).
> +
> switch (act) {
> case DTRACEACT_PRINTF:
> func = dtrace_fprintf;
> diff --git a/test/unittest/ustack/tst.uaddr.d b/test/unittest/ustack/tst.uaddr.d
> new file mode 100644
> index 00000000..0fce24d8
> --- /dev/null
> +++ b/test/unittest/ustack/tst.uaddr.d
> @@ -0,0 +1,17 @@
> +/*
> + * Oracle Linux DTrace.
> + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
> + * Licensed under the Universal Permissive License v 1.0 as shown at
> + * http://oss.oracle.com/licenses/upl.
> + */
> +
> +/* @@trigger: ustack-tst-basic */
> +
> +#pragma D option quiet
> +
> +profile-1
> +/pid == $target/
> +{
> + uaddr(ucaller);
> + exit(0);
> +}
> diff --git a/test/unittest/ustack/tst.uaddr.r b/test/unittest/ustack/tst.uaddr.r
> new file mode 100644
> index 00000000..be48a12a
> --- /dev/null
> +++ b/test/unittest/ustack/tst.uaddr.r
> @@ -0,0 +1 @@
> + ustack-tst-basic`myfunc_y+{ptr}
> diff --git a/test/unittest/ustack/tst.ufunc.d b/test/unittest/ustack/tst.ufunc.d
> new file mode 100644
> index 00000000..546653de
> --- /dev/null
> +++ b/test/unittest/ustack/tst.ufunc.d
> @@ -0,0 +1,17 @@
> +/*
> + * Oracle Linux DTrace.
> + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
> + * Licensed under the Universal Permissive License v 1.0 as shown at
> + * http://oss.oracle.com/licenses/upl.
> + */
> +
> +/* @@trigger: ustack-tst-basic */
> +
> +#pragma D option quiet
> +
> +profile-1
> +/pid == $target/
> +{
> + ufunc(ucaller);
> + exit(0);
> +}
> diff --git a/test/unittest/ustack/tst.ufunc.r b/test/unittest/ustack/tst.ufunc.r
> new file mode 100644
> index 00000000..2ebedb99
> --- /dev/null
> +++ b/test/unittest/ustack/tst.ufunc.r
> @@ -0,0 +1 @@
> + ustack-tst-basic`myfunc_y
> diff --git a/test/unittest/ustack/tst.umod.d b/test/unittest/ustack/tst.umod.d
> new file mode 100644
> index 00000000..b7d3e14f
> --- /dev/null
> +++ b/test/unittest/ustack/tst.umod.d
> @@ -0,0 +1,17 @@
> +/*
> + * Oracle Linux DTrace.
> + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
> + * Licensed under the Universal Permissive License v 1.0 as shown at
> + * http://oss.oracle.com/licenses/upl.
> + */
> +
> +/* @@trigger: ustack-tst-basic */
> +
> +#pragma D option quiet
> +
> +profile-1
> +/pid == $target/
> +{
> + umod(ucaller);
> + exit(0);
> +}
> diff --git a/test/unittest/ustack/tst.umod.r b/test/unittest/ustack/tst.umod.r
> new file mode 100644
> index 00000000..2a5b8297
> --- /dev/null
> +++ b/test/unittest/ustack/tst.umod.r
> @@ -0,0 +1 @@
> + ustack-tst-basic
> diff --git a/test/unittest/ustack/tst.usym.d b/test/unittest/ustack/tst.usym.d
> new file mode 100644
> index 00000000..3bd9dc23
> --- /dev/null
> +++ b/test/unittest/ustack/tst.usym.d
> @@ -0,0 +1,17 @@
> +/*
> + * Oracle Linux DTrace.
> + * Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
> + * Licensed under the Universal Permissive License v 1.0 as shown at
> + * http://oss.oracle.com/licenses/upl.
> + */
> +
> +/* @@trigger: ustack-tst-basic */
> +
> +#pragma D option quiet
> +
> +profile-1
> +/pid == $target/
> +{
> + usym(ucaller);
> + exit(0);
> +}
> diff --git a/test/unittest/ustack/tst.usym.r b/test/unittest/ustack/tst.usym.r
> new file mode 100644
> index 00000000..2ebedb99
> --- /dev/null
> +++ b/test/unittest/ustack/tst.usym.r
> @@ -0,0 +1 @@
> + ustack-tst-basic`myfunc_y
> --
> 2.18.4
>
>
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel
More information about the DTrace-devel
mailing list