[DTrace-devel] [PATCH] WIP Implement builtin variables
Kris Van Hees
kris.van.hees at oracle.com
Mon May 18 10:46:03 PDT 2020
This one isn't quite ready yet for review - feel free to look at it but please
know that it is still a work-in-progress.
On Mon, May 18, 2020 at 10:44:06AM -0700, Kris Van Hees wrote:
> Variables that are currently implemented:
>
> arg0 .. arg9
> curthread
> pid
> tid
> uid
> gid
>
> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
> bpf/Build | 2 +-
> bpf/get_bvar.c | 46 +++++++++++++++++++++++++++++++++++++++++++---
> libdtrace/dt_cg.c | 6 +++++-
> 3 files changed, 49 insertions(+), 5 deletions(-)
>
> diff --git a/bpf/Build b/bpf/Build
> index b24b71e0..bc77dcf3 100644
> --- a/bpf/Build
> +++ b/bpf/Build
> @@ -12,7 +12,7 @@ $(objdir)/include/.dir.stamp:
> @touch $(objdir)/include/.dir.stamp
>
> BPFLIBS += bpf_dlib
> -bpf_dlib_CPPFLAGS = -Ilibdtrace -I$(objdir)/include
> +bpf_dlib_CPPFLAGS = -Ilibdtrace -Iinclude -I$(objdir)/include
> bpf_dlib_TARGET = dlibs/bpf_dlib
> bpf_dlib_DIR := $(current-dir)
> bpf_dlib_SRCDEPS = $(objdir)/include/.dir.stamp
> diff --git a/bpf/get_bvar.c b/bpf/get_bvar.c
> index 6b0b354a..4891b144 100644
> --- a/bpf/get_bvar.c
> +++ b/bpf/get_bvar.c
> @@ -5,13 +5,53 @@
> #include <linux/bpf.h>
> #include <stdint.h>
> #include <bpf-helpers.h>
> +#include <dtrace/dif_defines.h>
> +#include <dt_bpf_ctx.h>
>
> #ifndef noinline
> # define noinline __attribute__((noinline))
> #endif
>
> -noinline uint64_t dt_get_bvar(uint32_t id)
> +noinline uint64_t dt_get_bvar(struct dt_bpf_context *dctx, uint32_t id)
> {
> - /* Not implemented yet. */
> - return (uint64_t)-1;
> + switch (id) {
> + case DIF_VAR_EPID:
> + return dctx->epid;
> + case DIF_VAR_ARG0: case DIF_VAR_ARG1: case DIF_VAR_ARG2:
> + case DIF_VAR_ARG3: case DIF_VAR_ARG4: case DIF_VAR_ARG5:
> + case DIF_VAR_ARG6: case DIF_VAR_ARG7: case DIF_VAR_ARG8:
> + case DIF_VAR_ARG9:
> + return dctx->argv[id - DIF_VAR_ARG0];
> + case DIF_VAR_CURTHREAD:
> + return bpf_get_current_task();
> + case DIF_VAR_TIMESTAMP:
> + return bpf_ktime_get_ns();
> + case DIF_VAR_PID: {
> + uint64_t val = bpf_get_current_pid_tgid();
> +
> + return val >> 32;
> + }
> + case DIF_VAR_TID: {
> + uint64_t val = bpf_get_current_pid_tgid();
> +
> + return val & 0x00000000ffffffffUL;
> + }
> + case DIF_VAR_UID: {
> + uint64_t val = bpf_get_current_uid_gid();
> +
> + return val & 0x00000000ffffffffUL;
> + }
> + case DIF_VAR_GID: {
> + uint64_t val = bpf_get_current_uid_gid();
> +
> + return val >> 32;
> + }
> + default:
> + /* Not implemented yet. */
> +#if 1
> + return (uint64_t)-1;
> +#else
> + return (uint64_t)id;
> +#endif
> + }
> }
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index 3e8adf86..e5d3ac73 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -895,7 +895,11 @@ dt_cg_load_var(dt_node_t *dst, dt_irlist_t *dlp, dt_regset_t *drp)
> if (dt_regset_xalloc_args(drp) == -1)
> longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
> if (idp->di_id < DIF_VAR_OTHER_UBASE) { /* built-in var */
> - instr = BPF_MOV_IMM(BPF_REG_1, idp->di_id);
> + instr = BPF_LOAD(BPF_DW, BPF_REG_1,
> + BPF_REG_FP, DT_STK_DCTX);
> + dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE,
> + instr));
> + instr = BPF_MOV_IMM(BPF_REG_2, idp->di_id);
> dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE,
> instr));
> idp = dt_dlib_get_func(yypcb->pcb_hdl, "dt_get_bvar");
> --
> 2.26.0
>
>
> _______________________________________________
> 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