[DTrace-devel] [PATCH] Standardize use of %r7, %r8, and %r9 in trampoline generation
eugene.loh at oracle.com
eugene.loh at oracle.com
Wed Jan 11 01:21:51 UTC 2023
From: Eugene Loh <eugene.loh at oracle.com>
In libdtrace/dt_cg.c, a number of functions generate the trampoline.
After a call to dt_cg_tramp_prologue[_act](), we can expect:
%r7 contains a pointer to dctx->mst
%r8 contains a pointer to dctx->ctx
%r9 contains a pointer to dctx
Most other calls to dt_cg_tramp_*() functions rely on these values.
However,
dt_cg_tramp_copy_args_from_regs()
dt_cg_tramp_copy_regs()
dt_cg_tramp_copy_rval_from_regs()
all pass BPF_REG_8 in via an argument rp. This is unnecessary. In fact,
the last two functions don't even use the passed-in argument, already using
the known, hard-wired value BPF_REG_8 instead.
Do not pass BPF_REG_8 in to these functions. Clean up the comments and
interfaces and switch dt_cg_tramp_copy_args_from_regs() to use BPF_REG_8
explicitly, as the other functions already do.
Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
libdtrace/dt_cg.c | 46 ++++++++++++++++++-------------------
libdtrace/dt_cg.h | 6 ++---
libdtrace/dt_prov_dtrace.c | 2 +-
libdtrace/dt_prov_fbt.c | 6 ++---
libdtrace/dt_prov_profile.c | 2 +-
libdtrace/dt_prov_uprobe.c | 6 ++---
6 files changed, 34 insertions(+), 34 deletions(-)
diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 4dffb7b1..7ba0ce89 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -287,20 +287,20 @@ dt_cg_tramp_clear_regs(dt_pcb_t *pcb)
}
/*
- * Copy the content of a dt_pt_regs structure referenced by the 'rp' argument
+ * Copy the content of a dt_pt_regs structure referenced by %r8
* into the 'regs' member of the machine state.
*
- * The caller must ensure that %r7 contains the value set by the
+ * The caller must ensure that %r7 and %r8 contain the values set by the
* dt_cg_tramp_prologue*() functions.
*/
void
-dt_cg_tramp_copy_regs(dt_pcb_t *pcb, int rp)
+dt_cg_tramp_copy_regs(dt_pcb_t *pcb)
{
dt_irlist_t *dlp = &pcb->pcb_ir;
int i;
/*
- * dctx->mst->regs = *(dt_pt_regs *)rp;
+ * dctx->mst->regs = *(dt_pt_regs *)%r8;
*/
for (i = 0; i < sizeof(dt_pt_regs); i += 8) {
emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_8, i));
@@ -309,16 +309,16 @@ dt_cg_tramp_copy_regs(dt_pcb_t *pcb, int rp)
}
/*
- * Copy arguments from a dt_pt_regs structure referenced by the 'rp' argument.
+ * Copy arguments from a dt_pt_regs structure referenced by %r8.
* If 'called' is nonzero, the registers are laid out as when inside the
* function: if zero, they are laid out as at the call instruction, before the
* function is called (as is done for e.g. usdt).
*
- * The caller must ensure that %r7 contains the value set by the
+ * The caller must ensure that %r7 and %r8 contain the values set by the
* dt_cg_tramp_prologue*() functions.
*/
void
-dt_cg_tramp_copy_args_from_regs(dt_pcb_t *pcb, int rp, int called)
+dt_cg_tramp_copy_args_from_regs(dt_pcb_t *pcb, int called)
{
dtrace_hdl_t *dtp = pcb->pcb_hdl;
dt_irlist_t *dlp = &pcb->pcb_ir;
@@ -326,28 +326,28 @@ dt_cg_tramp_copy_args_from_regs(dt_pcb_t *pcb, int rp, int called)
/*
* for (i = 0; i < PT_REGS_ARGC; i++)
- * dctx->mst->argv[i] = PT_REGS_ARGi((dt_pt_regs *)rp);
- * // lddw %r0, [%rp + PT_REGS_ARGi]
+ * dctx->mst->argv[i] = PT_REGS_ARGi((dt_pt_regs *)%r8);
+ * // lddw %r0, [%r8 + PT_REGS_ARGi]
* // stdw [%r7 + DMST_ARG(i)], %r0
*/
- emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, rp, PT_REGS_ARG0));
+ 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));
- emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, rp, PT_REGS_ARG1));
+ emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_8, PT_REGS_ARG1));
emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_ARG(1), BPF_REG_0));
- emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, rp, PT_REGS_ARG2));
+ emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_8, PT_REGS_ARG2));
emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_ARG(2), BPF_REG_0));
- emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, rp, PT_REGS_ARG3));
+ emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_8, PT_REGS_ARG3));
emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_ARG(3), BPF_REG_0));
- emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, rp, PT_REGS_ARG4));
+ emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_8, PT_REGS_ARG4));
emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_ARG(4), BPF_REG_0));
- emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, rp, PT_REGS_ARG5));
+ emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_8, PT_REGS_ARG5));
emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_ARG(5), BPF_REG_0));
#ifdef PT_REGS_ARG6
- emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, rp, PT_REGS_ARG6));
+ emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_8, PT_REGS_ARG6));
emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_ARG(6), BPF_REG_0));
#endif
#ifdef PT_REGS_ARG7
- emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, rp, PT_REGS_ARG7));
+ emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_8, PT_REGS_ARG7));
emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_ARG(7), BPF_REG_0));
#endif
@@ -360,7 +360,7 @@ dt_cg_tramp_copy_args_from_regs(dt_pcb_t *pcb, int rp, int called)
* int rc;
* uint64_t *sp;
*
- * sp = (uint64_t *)(((dt_pt_regs *)rp)->sp;
+ * sp = (uint64_t *)(((dt_pt_regs *)%r8)->sp;
* rc = bpf_probe_read[_user](dctx->mst->argv[i],
* sizeof(uint64_t),
* &sp[i - PT_REGS_ARGC +
@@ -368,7 +368,7 @@ dt_cg_tramp_copy_args_from_regs(dt_pcb_t *pcb, int rp, int called)
* // mov %r1, %r7
* // add %r1, DMST_ARG(i)
* // mov %r2, sizeof(uint64_t)
- * // lddw %r3, [%rp + PT_REGS_SP]
+ * // lddw %r3, [%r8 + PT_REGS_SP]
* // add %r3, (i - PT_REGS_ARGC +
* (called ? PT_REGS_ARGSTKBASE : 0)) *
* sizeof(uint64_t)
@@ -389,7 +389,7 @@ dt_cg_tramp_copy_args_from_regs(dt_pcb_t *pcb, int rp, int called)
emit(dlp, BPF_MOV_REG(BPF_REG_1, BPF_REG_7));
emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, DMST_ARG(i)));
emit(dlp, BPF_MOV_IMM(BPF_REG_2, sizeof(uint64_t)));
- emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_3, rp, PT_REGS_SP));
+ emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_3, BPF_REG_8, PT_REGS_SP));
emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, (i - PT_REGS_ARGC +
(called ? PT_REGS_ARGSTKBASE : 0)) * sizeof(uint64_t)));
emit(dlp, BPF_CALL_HELPER(dtp->dt_bpfhelper[BPF_FUNC_probe_read_user]));
@@ -401,14 +401,14 @@ dt_cg_tramp_copy_args_from_regs(dt_pcb_t *pcb, int rp, int called)
}
/*
- * Copy return value from a dt_pt_regs structure referenced by the 'rp' argument.
+ * Copy return value from a dt_pt_regs structure referenced by %r8
* to mst->arg[1]. Zero the other args.
*
- * The caller must ensure that %r7 contains the value set by the
+ * The caller must ensure that %r7 and %r8 contain the values set by the
* dt_cg_tramp_prologue*() functions.
*/
void
-dt_cg_tramp_copy_rval_from_regs(dt_pcb_t *pcb, int rp)
+dt_cg_tramp_copy_rval_from_regs(dt_pcb_t *pcb)
{
dt_irlist_t *dlp = &pcb->pcb_ir;
int i;
diff --git a/libdtrace/dt_cg.h b/libdtrace/dt_cg.h
index 1bfe3787..3742bc6a 100644
--- a/libdtrace/dt_cg.h
+++ b/libdtrace/dt_cg.h
@@ -23,9 +23,9 @@ extern dt_irnode_t *dt_cg_node_alloc(uint_t, struct bpf_insn);
extern void dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act);
extern void dt_cg_tramp_prologue(dt_pcb_t *pcb);
extern void dt_cg_tramp_clear_regs(dt_pcb_t *pcb);
-extern void dt_cg_tramp_copy_regs(dt_pcb_t *pcb, int rp);
-extern void dt_cg_tramp_copy_args_from_regs(dt_pcb_t *pcb, int rp, int called);
-extern void dt_cg_tramp_copy_rval_from_regs(dt_pcb_t *pcb, int rp);
+extern void dt_cg_tramp_copy_regs(dt_pcb_t *pcb);
+extern void dt_cg_tramp_copy_args_from_regs(dt_pcb_t *pcb, int called);
+extern void dt_cg_tramp_copy_rval_from_regs(dt_pcb_t *pcb);
extern void dt_cg_tramp_call_clauses(dt_pcb_t *pcb, const dt_probe_t *prp,
dt_activity_t act);
extern void dt_cg_tramp_return(dt_pcb_t *pcb);
diff --git a/libdtrace/dt_prov_dtrace.c b/libdtrace/dt_prov_dtrace.c
index 286e0d45..4a587efc 100644
--- a/libdtrace/dt_prov_dtrace.c
+++ b/libdtrace/dt_prov_dtrace.c
@@ -156,7 +156,7 @@ static void trampoline(dt_pcb_t *pcb)
emit(dlp, BPF_MOV_IMM(BPF_REG_4, BPF_ANY));
emit(dlp, BPF_CALL_HELPER(BPF_FUNC_map_update_elem));
- dt_cg_tramp_copy_regs(pcb, BPF_REG_8);
+ dt_cg_tramp_copy_regs(pcb);
/* zero the probe args */
for (i = 0; i < ARRAY_SIZE(((dt_mstate_t *)0)->argv); i++)
diff --git a/libdtrace/dt_prov_fbt.c b/libdtrace/dt_prov_fbt.c
index db037e4e..fdedb0be 100644
--- a/libdtrace/dt_prov_fbt.c
+++ b/libdtrace/dt_prov_fbt.c
@@ -157,11 +157,11 @@ static void trampoline(dt_pcb_t *pcb)
* // (%r7 = dctx->mst)
* // (%r8 = dctx->ctx)
*/
- dt_cg_tramp_copy_regs(pcb, BPF_REG_8);
+ dt_cg_tramp_copy_regs(pcb);
if (strcmp(pcb->pcb_probe->desc->prb, "return") == 0) {
dt_irlist_t *dlp = &pcb->pcb_ir;
- dt_cg_tramp_copy_rval_from_regs(pcb, BPF_REG_8);
+ dt_cg_tramp_copy_rval_from_regs(pcb);
/*
* fbt:::return arg0 should be the function offset for
@@ -175,7 +175,7 @@ static void trampoline(dt_pcb_t *pcb)
dt_cg_xsetx(dlp, NULL, DT_LBL_NONE, BPF_REG_0, -1);
emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_ARG(0), BPF_REG_0));
} else
- dt_cg_tramp_copy_args_from_regs(pcb, BPF_REG_8, 1);
+ dt_cg_tramp_copy_args_from_regs(pcb, 1);
dt_cg_tramp_epilogue(pcb);
}
diff --git a/libdtrace/dt_prov_profile.c b/libdtrace/dt_prov_profile.c
index 5e6c317a..6d1d3a80 100644
--- a/libdtrace/dt_prov_profile.c
+++ b/libdtrace/dt_prov_profile.c
@@ -226,7 +226,7 @@ static void trampoline(dt_pcb_t *pcb)
* // (%r8 = dctx->ctx)
*/
- dt_cg_tramp_copy_regs(pcb, BPF_REG_8);
+ dt_cg_tramp_copy_regs(pcb);
/*
* TODO:
diff --git a/libdtrace/dt_prov_uprobe.c b/libdtrace/dt_prov_uprobe.c
index d570c730..172efe94 100644
--- a/libdtrace/dt_prov_uprobe.c
+++ b/libdtrace/dt_prov_uprobe.c
@@ -360,11 +360,11 @@ static void trampoline(dt_pcb_t *pcb)
* // (%r8 = dctx->ctx)
*/
- dt_cg_tramp_copy_regs(pcb, BPF_REG_8);
+ dt_cg_tramp_copy_regs(pcb);
if (upp->flags & PP_IS_RETURN)
- dt_cg_tramp_copy_rval_from_regs(pcb, BPF_REG_8);
+ dt_cg_tramp_copy_rval_from_regs(pcb);
else
- dt_cg_tramp_copy_args_from_regs(pcb, BPF_REG_8,
+ dt_cg_tramp_copy_args_from_regs(pcb,
!(upp->flags & PP_IS_FUNCALL));
/*
--
2.18.4
More information about the DTrace-devel
mailing list