[DTrace-devel] [PATCH 13/15] cg: Pass exit label to trampoline

Kris Van Hees kris.van.hees at oracle.com
Thu Feb 23 07:24:17 UTC 2023


Some trampolines will need to be able to gemerate code for some form of
pre-conditions.  It therefore needs to know a jump label that will be
positioned right after the trampoline being generated.

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_cg.c           | 2 +-
 libdtrace/dt_prov_dtrace.c  | 2 +-
 libdtrace/dt_prov_fbt.c     | 2 +-
 libdtrace/dt_prov_profile.c | 2 +-
 libdtrace/dt_prov_rawtp.c   | 2 +-
 libdtrace/dt_prov_sdt.c     | 2 +-
 libdtrace/dt_prov_syscall.c | 2 +-
 libdtrace/dt_prov_uprobe.c  | 2 +-
 libdtrace/dt_provider.h     | 3 ++-
 9 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index f1d05d6c..4b619cc7 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -6960,7 +6960,7 @@ dt_cg(dt_pcb_t *pcb, dt_node_t *dnp)
 		assert(pcb->pcb_probe != NULL);
 
 		if (pcb->pcb_probe->prov->impl->trampoline != NULL)
-			pcb->pcb_probe->prov->impl->trampoline(pcb);
+			pcb->pcb_probe->prov->impl->trampoline(pcb, pcb->pcb_exitlbl);
 	} else
 		dt_cg_node(dnp, &pcb->pcb_ir, pcb->pcb_regs);
 
diff --git a/libdtrace/dt_prov_dtrace.c b/libdtrace/dt_prov_dtrace.c
index 4a587efc..38158ace 100644
--- a/libdtrace/dt_prov_dtrace.c
+++ b/libdtrace/dt_prov_dtrace.c
@@ -77,7 +77,7 @@ static int populate(dtrace_hdl_t *dtp)
  * The trampoline will populate a dt_dctx_t struct and then call the function
  * that implements the compiled D clause.  It returns 0 to the caller.
  */
-static void trampoline(dt_pcb_t *pcb)
+static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
 {
 	dt_irlist_t	*dlp = &pcb->pcb_ir;
 	dt_activity_t	act = DT_ACTIVITY_ACTIVE;
diff --git a/libdtrace/dt_prov_fbt.c b/libdtrace/dt_prov_fbt.c
index fdedb0be..add76c55 100644
--- a/libdtrace/dt_prov_fbt.c
+++ b/libdtrace/dt_prov_fbt.c
@@ -148,7 +148,7 @@ static int populate(dtrace_hdl_t *dtp)
  * The trampoline will populate a dt_dctx_t struct and then call the function
  * that implements the compiled D clause.  It returns 0 to the caller.
  */
-static void trampoline(dt_pcb_t *pcb)
+static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
 {
 	dt_cg_tramp_prologue(pcb);
 
diff --git a/libdtrace/dt_prov_profile.c b/libdtrace/dt_prov_profile.c
index 6d1d3a80..60dad547 100644
--- a/libdtrace/dt_prov_profile.c
+++ b/libdtrace/dt_prov_profile.c
@@ -213,7 +213,7 @@ static int provide(dtrace_hdl_t *dtp, const dtrace_probedesc_t *pdp)
  *         __u64 addr;
  *     }
  */
-static void trampoline(dt_pcb_t *pcb)
+static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
 {
 	int		i;
 	dt_irlist_t	*dlp = &pcb->pcb_ir;
diff --git a/libdtrace/dt_prov_rawtp.c b/libdtrace/dt_prov_rawtp.c
index 58b0947f..ac95df34 100644
--- a/libdtrace/dt_prov_rawtp.c
+++ b/libdtrace/dt_prov_rawtp.c
@@ -131,7 +131,7 @@ static int populate(dtrace_hdl_t *dtp)
  * that implements the compiled D clause.  It returns the value that it gets
  * back from that function.
  */
-static void trampoline(dt_pcb_t *pcb)
+static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
 {
 	int		i;
 	dt_irlist_t	*dlp = &pcb->pcb_ir;
diff --git a/libdtrace/dt_prov_sdt.c b/libdtrace/dt_prov_sdt.c
index ca47cf41..dd0d06f0 100644
--- a/libdtrace/dt_prov_sdt.c
+++ b/libdtrace/dt_prov_sdt.c
@@ -128,7 +128,7 @@ static int populate(dtrace_hdl_t *dtp)
  * that implements the compiled D clause.  It returns the value that it gets
  * back from that function.
  */
-static void trampoline(dt_pcb_t *pcb)
+static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
 {
 	int		i;
 	dt_irlist_t	*dlp = &pcb->pcb_ir;
diff --git a/libdtrace/dt_prov_syscall.c b/libdtrace/dt_prov_syscall.c
index 518340a9..18d451f8 100644
--- a/libdtrace/dt_prov_syscall.c
+++ b/libdtrace/dt_prov_syscall.c
@@ -131,7 +131,7 @@ static int populate(dtrace_hdl_t *dtp)
  * The trampoline will populate a dt_dctx_t struct and then call the function
  * that implements the compiled D clause.  It returns 0 to the caller.
  */
-static void trampoline(dt_pcb_t *pcb)
+static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
 {
 	int		i;
 	dt_irlist_t	*dlp = &pcb->pcb_ir;
diff --git a/libdtrace/dt_prov_uprobe.c b/libdtrace/dt_prov_uprobe.c
index 1ab1fe98..f85d1529 100644
--- a/libdtrace/dt_prov_uprobe.c
+++ b/libdtrace/dt_prov_uprobe.c
@@ -344,7 +344,7 @@ static void enable(dtrace_hdl_t *dtp, dt_probe_t *prp)
  * The trampoline will first populate a dt_dctx_t struct.  It will then emulate
  * the firing of all dependent pid* probes and their clauses.
  */
-static void trampoline(dt_pcb_t *pcb)
+static void trampoline(dt_pcb_t *pcb, uint_t exitlbl)
 {
 	dt_irlist_t		*dlp = &pcb->pcb_ir;
 	const dt_probe_t	*prp = pcb->pcb_probe;
diff --git a/libdtrace/dt_provider.h b/libdtrace/dt_provider.h
index 49563f35..92fa7d55 100644
--- a/libdtrace/dt_provider.h
+++ b/libdtrace/dt_provider.h
@@ -66,7 +66,8 @@ typedef struct dt_provimpl {
 		       const pid_probespec_t *psp);
 	void (*enable)(dtrace_hdl_t *dtp,	/* enable the given probe */
 		       struct dt_probe *prp);
-	void (*trampoline)(dt_pcb_t *pcb);	/* generate BPF trampoline */
+	void (*trampoline)(dt_pcb_t *pcb,	/* generate BPF trampoline */
+			   uint_t exitlbl);
 	int (*attach)(dtrace_hdl_t *dtp,	/* attach BPF prog to probe */
 		      const struct dt_probe *prp, int bpf_fd);
 	int (*probe_info)(dtrace_hdl_t *dtp,	/* get probe info */
-- 
2.39.1




More information about the DTrace-devel mailing list