[PATCH 36/38] Inline copyout_val()

eugene.loh
2024-06-27T05:39:59Z

From: Eugene Loh <eugene.loh@oracle.com>

Squash to "Use uprobes map to call clauses conditionally"?

Why do we call dt_cg_tramp_copy_regs()?

Why do we copy [%r8+PT_REGS_ARG0] to [%r7+DMST_ARG(0)]? Can we not
use it in place?

Signed-off-by: Eugene Loh <eugene.loh@oracle.com>
---
libdtrace/dt_prov_uprobe.c | 38 ++++++++------------------------------
1 file changed, 8 insertions(+), 30 deletions(-)

diff --git a/libdtrace/dt_prov_uprobe.c b/libdtrace/dt_prov_uprobe.c
index 43c77fe4..aa605696 100644
--- a/libdtrace/dt_prov_uprobe.c
+++ b/libdtrace/dt_prov_uprobe.c
@@ -604,33 +604,6 @@ static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
return 0;
}

-/*
- * Copy the given immediate value into the address given by the specified probe
- * argument.
- */
-static void
-copyout_val(dt_pcb_t *pcb, uint_t lbl, uint32_t val, int arg)
-{
- dt_regset_t *drp = pcb->pcb_regs;
- dt_irlist_t *dlp = &pcb->pcb_ir;
-
- emitl(dlp, lbl, BPF_STORE_IMM(BPF_DW, BPF_REG_FP, DT_TRAMP_SP_SLOT(0),
- val));
-
- if (dt_regset_xalloc_args(drp) == -1)
- longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
- emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_1, BPF_REG_7, DMST_ARG(arg)));
- emit(dlp, BPF_MOV_REG(BPF_REG_2, BPF_REG_FP));
- emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, DT_TRAMP_SP_SLOT(0)));
- emit(dlp, BPF_MOV_IMM(BPF_REG_3, sizeof(uint32_t)));
- dt_regset_xalloc(drp, BPF_REG_0);
- emit(dlp, BPF_CALL_HELPER(BPF_FUNC_probe_write_user));
-
- /* XXX any point error-checking here? What can we possibly do? */
- dt_regset_free(drp, BPF_REG_0);
- dt_regset_free_args(drp);
-}
-
/*
* Generate a BPF trampoline for an is-enabled probe. The is-enabled probe
* prototype looks like:
@@ -661,7 +634,7 @@ static int trampoline_is_enabled(dt_pcb_t *pcb, uint_t exitlbl)
* Copy in the first function argument, a pointer value to which
* the is-enabled state of the probe will be written (necessarily
* 1 if this probe is running at all).
- */
+ */ // FIXME why are we doing this? can't we use it in-place?
emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_8, PT_REGS_ARG0));
emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_ARG(0), BPF_REG_0));

@@ -685,10 +658,15 @@ static int trampoline_is_enabled(dt_pcb_t *pcb, uint_t exitlbl)
emit(dlp, BPF_BRANCH_IMM(BPF_JEQ, BPF_REG_0, 0, pcb->pcb_exitlbl));

/*
- * If we succeeded, then we use copyout_val() above to assign:
+ * If we succeeded, then we assign:
* *arg0 = 1;
*/
- copyout_val(pcb, DT_LBL_NONE, 1, 0); // FIXME: This is the only copyout_val() call site... should we just inline it here?
+ emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_FP, DT_TRAMP_SP_SLOT(0), 1));
+ emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_1, BPF_REG_7, DMST_ARG(0))); // FIXME: Why don't we just copy from %r8+?
+ emit(dlp, BPF_MOV_REG(BPF_REG_2, BPF_REG_FP));
+ emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_2, DT_TRAMP_SP_SLOT(0)));
+ emit(dlp, BPF_MOV_IMM(BPF_REG_3, sizeof(uint32_t)));
+ emit(dlp, BPF_CALL_HELPER(BPF_FUNC_probe_write_user));

dt_cg_tramp_return(pcb);

--
2.18.4