[DTrace-devel] [PATCH v2 36/38] Simplify trampoline_is_enabled()
eugene.loh at oracle.com
eugene.loh at oracle.com
Fri Jun 28 02:03:15 UTC 2024
From: Eugene Loh <eugene.loh at oracle.com>
Do not bother with dt_cg_tramp_copy_regs() since the copied
values will not be used.
Do not bother with the (second) copy of regs[arg0] to mst->arg[0].
Inline copyout_val().
Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
libdtrace/dt_prov_uprobe.c | 48 +++++++-------------------------------
1 file changed, 8 insertions(+), 40 deletions(-)
diff --git a/libdtrace/dt_prov_uprobe.c b/libdtrace/dt_prov_uprobe.c
index 38974609..eeb68516 100644
--- a/libdtrace/dt_prov_uprobe.c
+++ b/libdtrace/dt_prov_uprobe.c
@@ -611,33 +611,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:
@@ -655,22 +628,12 @@ static int trampoline_is_enabled(dt_pcb_t *pcb, uint_t exitlbl)
assert(uprobes != NULL);
- dt_cg_tramp_prologue(pcb);
-
/*
* After the dt_cg_tramp_prologue() call, we have:
* // (%r7 = dctx->mst)
* // (%r8 = dctx->ctx)
*/
- dt_cg_tramp_copy_regs(pcb);
-
- /*
- * 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).
- */
- 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));
+ dt_cg_tramp_prologue(pcb);
/*
* Retrieve the PID of the process that caused the probe to fire.
@@ -699,10 +662,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);
+ emit(dlp, BPF_STORE_IMM(BPF_W, BPF_REG_FP, DT_TRAMP_SP_SLOT(0), 1));
+ emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_1, BPF_REG_8, PT_REGS_ARG0));
+ 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.43.5
More information about the DTrace-devel
mailing list