[DTrace-devel] [PATCH] cg, bpf: Pass dctx as first arg in arg-to-tstring subroutines
Eugene Loh
eugene.loh at oracle.com
Fri Jul 21 21:16:28 UTC 2023
Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
looks fine, though might be better as part of a patch series that uses it
On 7/21/23 14:00, Kris Van Hees via DTrace-devel wrote:
> Passing a pointer to the DTrace context (dctx) enables subroutines
> called through arg-to-tstring to report faults if necessary. It also
> gives the implementation of these subroutines access to context data.
> (None use that as of yet, but e.g. inet_ntoa6() is expected to need
> it.)
>
> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
> bpf/basename.S | 6 +++---
> bpf/dirname.S | 6 +++---
> bpf/inet_ntoa.S | 6 +++---
> bpf/lltostr.S | 6 +++---
> libdtrace/dt_cg.c | 8 +++++---
> 5 files changed, 17 insertions(+), 15 deletions(-)
>
> diff --git a/bpf/basename.S b/bpf/basename.S
> index 23cf15d0..822e0517 100644
> --- a/bpf/basename.S
> +++ b/bpf/basename.S
> @@ -6,7 +6,7 @@
> #define BPF_FUNC_probe_read_str 45
>
> /*
> - * void dt_basename(char *src, char *dst);
> + * void dt_basename(const dt_dctx_t *dctx, char *src, char *dst);
> */
> .text
> .align 4
> @@ -19,8 +19,8 @@ dt_basename :
> #define LEN %r9
>
> /* store copies of input arguments */
> - mov SRC, %r1
> - mov DST, %r2
> + mov SRC, %r2
> + mov DST, %r3
>
> /*
> * Copy src to dst for two reasons:
> diff --git a/bpf/dirname.S b/bpf/dirname.S
> index 7ff90b47..2b902172 100644
> --- a/bpf/dirname.S
> +++ b/bpf/dirname.S
> @@ -6,7 +6,7 @@
> #define BPF_FUNC_probe_read_str 45
>
> /*
> - * void dt_dirname(char *src, char *dst);
> + * void dt_dirname(const dt_dctx_t *dctx, char *src, char *dst);
> */
> .text
> .align 4
> @@ -18,8 +18,8 @@ dt_dirname :
> #define LEN %r8
>
> /* store copies of input arguments */
> - mov SRC, %r1
> - mov DST, %r2
> + mov SRC, %r2
> + mov DST, %r3
>
> /*
> * Copy src to dst for two reasons:
> diff --git a/bpf/inet_ntoa.S b/bpf/inet_ntoa.S
> index 08b63b8d..24de04fd 100644
> --- a/bpf/inet_ntoa.S
> +++ b/bpf/inet_ntoa.S
> @@ -114,7 +114,7 @@ dt_inet_ntoa_write_uint8:
> #undef PTR
>
> /*
> - * uint64_t dt_inet_ntoa(uint8_t *src, char *dst) {
> + * uint64_t dt_inet_ntoa(const dt_dctx_t *dctx, uint8_t *src, char *dst) {
> * uint64_t off, inp, len;
> *
> * bpf_probe_read(fp + -4, 4, src);
> @@ -161,9 +161,9 @@ dt_inet_ntoa:
> #define DST %r7
> #define LEN %r8
>
> - mov DST, %r2
> + mov DST, %r3
>
> - mov %r3, %r1
> + mov %r3, %r2
> mov %r2, 4
> mov %r1, %fp
> add %r1, -4
> diff --git a/bpf/lltostr.S b/bpf/lltostr.S
> index b21001ab..3fa2895c 100644
> --- a/bpf/lltostr.S
> +++ b/bpf/lltostr.S
> @@ -8,7 +8,7 @@
>
> .text
> /*
> - * void dt_lltostr(uint64_t VAL, char *STR)
> + * void dt_lltostr(const dt_dctx_t *dctx, uint64_t VAL, char *STR)
> * {
> * // start writing at the end (IDX==1 is the last char)
> * IDX = 1
> @@ -74,8 +74,8 @@ dt_lltostr:
> #define IDX %r8
> #define SGN %r9
>
> - mov VAL, %r1
> - mov STR, %r2
> + mov VAL, %r2
> + mov STR, %r3
>
> mov IDX, 1 /* IDX = 1 */
>
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index 5391a143..bb6cff4a 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -4567,7 +4567,8 @@ dt_cg_array_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
>
> /*
> * Emit code to call a precompiled BPF function (named by fname)
> - * that is of return type void and takes two arguments:
> + * that is of return type void and takes three arguments:
> + * - a pointer to the DTrace context (dctx)
> * - one input value
> * - a pointer to an output tstring, allocated here
> */
> @@ -4599,12 +4600,13 @@ dt_cg_subr_arg_to_tstring(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp,
> if (dt_regset_xalloc_args(drp) == -1)
> longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
>
> - emit(dlp, BPF_MOV_REG(BPF_REG_1, arg->dn_reg));
> + emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_1, BPF_REG_FP, DT_STK_DCTX));
> + emit(dlp, BPF_MOV_REG(BPF_REG_2, arg->dn_reg));
> dt_regset_free(drp, arg->dn_reg);
> if (dt_node_is_string(arg))
> dt_cg_tstring_free(yypcb, arg);
>
> - emit(dlp, BPF_MOV_REG(BPF_REG_2, dnp->dn_reg));
> + emit(dlp, BPF_MOV_REG(BPF_REG_3, dnp->dn_reg));
>
> idp = dt_dlib_get_func(yypcb->pcb_hdl, fname);
> assert(idp != NULL);
More information about the DTrace-devel
mailing list