[DTrace-devel] [PATCH 2/3] Provide and use standard functions to clear or copy CPU registers
Kris Van Hees
kris.van.hees at oracle.com
Fri Jul 2 11:19:00 PDT 2021
Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
libdtrace/dt_cg.c | 44 +++++++++++++++++++++++++++++++++++++
libdtrace/dt_cg.h | 2 ++
libdtrace/dt_dctx.h | 2 --
libdtrace/dt_prov_dtrace.c | 16 +-------------
libdtrace/dt_prov_fbt.c | 11 +---------
libdtrace/dt_prov_pid.c | 16 +-------------
libdtrace/dt_prov_profile.c | 13 +----------
libdtrace/dt_prov_sdt.c | 16 +++-----------
libdtrace/dt_prov_syscall.c | 11 +---------
9 files changed, 54 insertions(+), 77 deletions(-)
diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 99e5c05a..be61b4b0 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -196,6 +196,50 @@ dt_cg_tramp_prologue(dt_pcb_t *pcb)
dt_cg_tramp_prologue_act(pcb, DT_ACTIVITY_ACTIVE);
}
+/*
+ * Clear the content of the 'regs' member of the machine state.
+ *
+ * The caller must ensure that %r7 contains the value set by the
+ * dt_cg_tramp_prologue*() functions.
+ */
+void
+dt_cg_tramp_clear_regs(dt_pcb_t *pcb)
+{
+ dt_irlist_t *dlp = &pcb->pcb_ir;
+ int i;
+
+ /*
+ * memset(&dctx->mst->regs, 0, sizeof(dt_pt_regs);
+ * // stdw [%7 + DMST_REGS + 0 * 8], 0
+ * // stdw [%7 + DMST_REGS + 1 * 8], 0
+ * // (...)
+ */
+ for (i = 0; i < sizeof(dt_pt_regs); i += 8)
+ emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_7, DMST_REGS + i, 0));
+}
+
+/*
+ * Copy the content of a dt_pt_regs structure referenced by the 'rp' argument
+ * into the 'regs' member of the machine state.
+ *
+ * The caller must ensure that %r7 contains the value set by the
+ * dt_cg_tramp_prologue*() functions.
+ */
+void
+dt_cg_tramp_copy_regs(dt_pcb_t *pcb, int rp)
+{
+ dt_irlist_t *dlp = &pcb->pcb_ir;
+ int i;
+
+ /*
+ * dctx->mst->regs = *(dt_pt_regs *)rp;
+ */
+ for (i = 0; i < sizeof(dt_pt_regs); i += 8) {
+ emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_8, i));
+ emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_REGS + i, BPF_REG_0));
+ }
+}
+
/*
* Copy arguments from a dt_pt_regs structure referenced by the 'rp' argument.
*
diff --git a/libdtrace/dt_cg.h b/libdtrace/dt_cg.h
index 96ce56f8..5752151b 100644
--- a/libdtrace/dt_cg.h
+++ b/libdtrace/dt_cg.h
@@ -22,6 +22,8 @@ extern void dt_cg_xsetx(dt_irlist_t *, dt_ident_t *, uint_t, int, uint64_t);
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);
extern void dt_cg_tramp_call_clauses(dt_pcb_t *pcb, const dt_probe_t *prp,
dt_activity_t act);
diff --git a/libdtrace/dt_dctx.h b/libdtrace/dt_dctx.h
index f0d42f4b..c065dc70 100644
--- a/libdtrace/dt_dctx.h
+++ b/libdtrace/dt_dctx.h
@@ -25,9 +25,7 @@ typedef struct dt_mstate {
int32_t syscall_errno; /* syscall errno */
uint64_t fault; /* DTrace fault flags */
uint64_t tstamp; /* cached timestamp value */
-#if 0
dt_pt_regs regs; /* CPU registers */
-#endif
uint64_t argv[10]; /* Probe arguments */
} dt_mstate_t;
diff --git a/libdtrace/dt_prov_dtrace.c b/libdtrace/dt_prov_dtrace.c
index 1c40c233..c8a55475 100644
--- a/libdtrace/dt_prov_dtrace.c
+++ b/libdtrace/dt_prov_dtrace.c
@@ -155,21 +155,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));
-#if 0
- /*
- * dctx->mst->regs = *(dt_pt_regs *)dctx->ctx;
- * // lddw %r0, [%r8 + 0]
- * // stdw [%r7 + DMST_REGS + 0], %r0
- * // lddw %r0, [%r8 + 8]
- * // stdw [%r7 + DMST_REGS + 8], %r0
- * // (...)
- */
- for (i = 0; i < sizeof(dt_pt_regs); i += 8) {
- emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_8, i));
- emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_REGS + i, BPF_REG_0));
- }
-#endif
-
+ dt_cg_tramp_copy_regs(pcb, BPF_REG_8);
dt_cg_tramp_copy_args_from_regs(pcb, BPF_REG_8);
dt_cg_tramp_epilogue_advance(pcb, act);
diff --git a/libdtrace/dt_prov_fbt.c b/libdtrace/dt_prov_fbt.c
index 80bbf721..62fea51e 100644
--- a/libdtrace/dt_prov_fbt.c
+++ b/libdtrace/dt_prov_fbt.c
@@ -168,16 +168,7 @@ static void trampoline(dt_pcb_t *pcb)
* // (%r8 = dctx->ctx)
*/
-#if 0
- /*
- * dctx->mst->regs = *(dt_pt_regs *)dctx->ctx;
- */
- for (i = 0; i < sizeof(dt_pt_regs); i += 8) {
- emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_8, i));
- emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_REGS + i, BPF_REG_0));
- }
-#endif
-
+ dt_cg_tramp_copy_regs(pcb, BPF_REG_8);
dt_cg_tramp_copy_args_from_regs(pcb, BPF_REG_8);
dt_cg_tramp_epilogue(pcb);
}
diff --git a/libdtrace/dt_prov_pid.c b/libdtrace/dt_prov_pid.c
index 2e9c5bee..af894f79 100644
--- a/libdtrace/dt_prov_pid.c
+++ b/libdtrace/dt_prov_pid.c
@@ -210,21 +210,7 @@ static void trampoline(dt_pcb_t *pcb)
* // (%r8 = dctx->ctx)
*/
-#if 0
- /*
- * dctx->mst->regs = *(dt_pt_regs *)dctx->ctx;
- * // lddw %r0, [%r8 + 0]
- * // stdw [%r7 + DMST_REGS + 0], %r0
- * // lddw %r0, [%r8 + 8]
- * // stdw [%r7 + DMST_REGS + 8], %r0
- * // (...)
- */
- for (i = 0; i < sizeof(dt_pt_regs); i += 8) {
- emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_8, i));
- emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_REGS + i, BPF_REG_0));
- }
-#endif
-
+ dt_cg_tramp_copy_regs(pcb, BPF_REG_8);
dt_cg_tramp_copy_args_from_regs(pcb, BPF_REG_8);
/*
diff --git a/libdtrace/dt_prov_profile.c b/libdtrace/dt_prov_profile.c
index 313c8c9c..caa414ca 100644
--- a/libdtrace/dt_prov_profile.c
+++ b/libdtrace/dt_prov_profile.c
@@ -226,18 +226,7 @@ static void trampoline(dt_pcb_t *pcb)
* // (%r8 = dctx->ctx)
*/
-#if 0
- /*
- * dctx->mst->regs = *(dt_pt_regs *)&dctx->ctx->regs;
- * // (we use the fact that regs is the
- * // member at offset 0, and there can
- * // copy *(dt_pt_regs *)dctx->ctx)
- */
- for (i = 0; i < sizeof(dt_pt_regs); i += 8) {
- emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_8, i));
- emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_REGS + i, BPF_REG_0));
- }
-#endif
+ dt_cg_tramp_copy_regs(pcb, BPF_REG_8);
/*
* TODO:
diff --git a/libdtrace/dt_prov_sdt.c b/libdtrace/dt_prov_sdt.c
index 320edbd2..712f533f 100644
--- a/libdtrace/dt_prov_sdt.c
+++ b/libdtrace/dt_prov_sdt.c
@@ -121,7 +121,7 @@ static int populate(dtrace_hdl_t *dtp)
* The trampoline function is called when a SDT probe triggers, and it must
* satisfy the following prototype:
*
- * int dt_sdt(struct syscall_data *scd)
+ * int dt_sdt(void *data)
*
* The trampoline will populate a dt_dctx_t struct and then call the function
* that implements the compiled D clause. It returns the value that it gets
@@ -142,17 +142,7 @@ static void trampoline(dt_pcb_t *pcb)
* // (%r8 = dctx->ctx)
*/
-#if 0
- /*
- * memset(&dctx->mst->regs, 0, sizeof(dt_pt_regs);
- * // stdw [%7 + DMST_REGS + 0], 0
- * // stdw [%7 + DMST_REGS + 8], 0
- * // (...)
- */
- for (i = 0; i < sizeof(dt_pt_regs); i += 8) {
- emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_7, DMST_REGS + i, 0));
- }
-#endif
+ dt_cg_tramp_clear_regs(pcb);
/*
* for (i = 0; i < ARRAY_SIZE(((dt_mstate_t *)0)->argv); i++)
@@ -175,7 +165,7 @@ static int probe_info(dtrace_hdl_t *dtp, const dt_probe_t *prp,
/*
* If the tracepoint has already been created and we have its info,
- * there is no need to retrive the info again.
+ * there is no need to retrieve the info again.
*/
if (dt_tp_is_created(tpp))
return -1;
diff --git a/libdtrace/dt_prov_syscall.c b/libdtrace/dt_prov_syscall.c
index bbf45888..2c6644d4 100644
--- a/libdtrace/dt_prov_syscall.c
+++ b/libdtrace/dt_prov_syscall.c
@@ -156,16 +156,7 @@ static void trampoline(dt_pcb_t *pcb)
* // (%r8 = dctx->ctx)
*/
-#if 0
- /*
- * memset(&dctx->mst->regs, 0, sizeof(dt_pt_regs);
- * // stdw [%7 + DMST_REGS + 0], 0
- * // stdw [%7 + DMST_REGS + 8], 0
- * // (...)
- */
- for (i = 0; i < sizeof(dt_pt_regs); i += 8)
- emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_7, DMST_REGS + i, 0));
-#endif
+ dt_cg_tramp_clear_regs(pcb);
/*
* for (i = 0; i < argc; i++)
--
2.31.1
More information about the DTrace-devel
mailing list