[DTrace-devel] [PATCH 03/12] cg: reserve %r7 and %r8 in trampolines

Kris Van Hees kris.van.hees at oracle.com
Fri Jan 5 05:26:54 UTC 2024


Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_cg.c | 12 +++++++++++-
 1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 30b1da16..d9d56f0a 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -1,6 +1,6 @@
 /*
  * Oracle Linux DTrace.
- * Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved.
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
@@ -138,6 +138,7 @@ dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act)
 {
 	dtrace_hdl_t	*dtp = pcb->pcb_hdl;
 	dt_irlist_t	*dlp = &pcb->pcb_ir;
+	dt_regset_t	*drp = pcb->pcb_regs;
 	dt_ident_t	*aggs = dt_dlib_get_map(dtp, "aggs");
 	dt_ident_t	*mem = dt_dlib_get_map(dtp, "mem");
 	dt_ident_t	*state = dt_dlib_get_map(dtp, "state");
@@ -151,6 +152,10 @@ dt_cg_tramp_prologue_act(dt_pcb_t *pcb, dt_activity_t act)
 	assert(prid != NULL);
 	assert(ro_off != NULL);
 
+	/* Reserve %r7 and %r8. */
+	dt_regset_xalloc(drp, BPF_REG_7);
+	dt_regset_xalloc(drp, BPF_REG_8);
+
 	/*
 	 * On input, %r1 is the BPF context.
 	 *
@@ -718,6 +723,7 @@ void
 dt_cg_tramp_return(dt_pcb_t *pcb)
 {
 	dt_irlist_t	*dlp = &pcb->pcb_ir;
+	dt_regset_t	*drp = pcb->pcb_regs;
 
 	/*
 	 * exit:
@@ -728,6 +734,10 @@ dt_cg_tramp_return(dt_pcb_t *pcb)
 	emitl(dlp, pcb->pcb_exitlbl,
 		   BPF_MOV_IMM(BPF_REG_0, 0));
 	emit(dlp,  BPF_RETURN());
+
+	/* Free %r7 and %r8. */
+	dt_regset_free(drp, BPF_REG_7);
+	dt_regset_free(drp, BPF_REG_8);
 }
 
 void
-- 
2.42.0




More information about the DTrace-devel mailing list