[DTrace-devel] [PATCH v5 1/6] cg: refactor get_member() to use dt_cg_ctf_offsetof
Alan Maguire
alan.maguire at oracle.com
Tue Jul 22 10:07:44 UTC 2025
Add an optional ldopp parameter to support retrieving load size.
and rename get_member() to dt_cg_tramp_get_member() as it is
intended for trampoline context.
It will be used by both dt_prov_ip.c and dt_prov_tcp.c.
Co-developed-by: Kris Van Hees <kris.van.hees at oracle.com>
Signed-off-by: Alan Maguire <alan.maguire at oracle.com>
---
libdtrace/dt_cg.c | 57 ++++++++++++++++++++++----
libdtrace/dt_cg.h | 4 +-
libdtrace/dt_prov_io.c | 84 +++++++++++++++++++-------------------
libdtrace/dt_prov_ip.c | 45 ++------------------
libdtrace/dt_prov_proc.c | 4 +-
libdtrace/dt_prov_sched.c | 2 +-
libdtrace/dt_prov_uprobe.c | 4 +-
7 files changed, 102 insertions(+), 98 deletions(-)
diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 0607cd4e..80d8c8e3 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -1893,7 +1893,7 @@ dt_cg_clsflags(dt_pcb_t *pcb, dtrace_actkind_t kind, const dt_node_t *dnp)
*/
int
dt_cg_ctf_offsetof(const char *structname, const char *membername,
- size_t *sizep, int relaxed)
+ size_t *sizep, uint_t *ldopp, int relaxed)
{
dtrace_typeinfo_t sym;
ctf_file_t *ctfp;
@@ -1913,12 +1913,51 @@ dt_cg_ctf_offsetof(const char *structname, const char *membername,
longjmp(yypcb->pcb_jmpbuf, EDT_NOCTF);
}
- if (sizep)
- *sizep = ctf_type_size(ctfp, ctm.ctm_type);
+ if (sizep || ldopp) {
+ uint_t ldop;
+
+ ldop = dt_cg_ldsize(NULL, ctfp, ctm.ctm_type, sizep);
+ if (ldopp)
+ *ldopp = ldop;
+ }
return (ctm.ctm_offset / NBBY);
}
+/*
+ * Retrieve the value of a member in a given struct.
+ *
+ * Entry:
+ * reg = TYPE *ptr
+ *
+ * Return:
+ * %r0 = ptr->member
+ * Clobbers:
+ * %r1 .. %r5
+ */
+void
+dt_cg_tramp_get_member(dt_pcb_t *pcb, const char *name, int reg,
+ const char *member)
+{
+ dtrace_hdl_t *dtp = pcb->pcb_hdl;
+ dt_irlist_t *dlp = &pcb->pcb_ir;
+ int offset;
+ size_t size;
+ uint_t ldop;
+
+ offset = dt_cg_ctf_offsetof(name, member, &size, &ldop, 0);
+ if (offset == -1)
+ return;
+
+ emit(dlp, BPF_MOV_REG(BPF_REG_3, reg));
+ emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, offset));
+ emit(dlp, BPF_MOV_IMM(BPF_REG_2, size));
+ emit(dlp, BPF_MOV_REG(BPF_REG_1, BPF_REG_FP));
+ emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, DT_TRAMP_SP_BASE));
+ emit(dlp, BPF_CALL_HELPER(dtp->dt_bpfhelper[BPF_FUNC_probe_read_kernel]));
+ emit(dlp, BPF_LOAD(ldop, BPF_REG_0, BPF_REG_FP, DT_TRAMP_SP_BASE));
+}
+
static void
dt_cg_act_breakpoint(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
{
@@ -2210,7 +2249,7 @@ dt_cg_act_pcap(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
*/
dt_cg_node(addr, dlp, drp);
- off = dt_cg_ctf_offsetof("struct sk_buff", "len", NULL, 0);
+ off = dt_cg_ctf_offsetof("struct sk_buff", "len", NULL, NULL, 0);
if (dt_regset_xalloc_args(drp) == -1)
longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
@@ -2230,7 +2269,7 @@ dt_cg_act_pcap(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
emit(dlp, BPF_LOAD(BPF_DW, lenreg, BPF_REG_FP, DT_STK_SP));
emit(dlp, BPF_LOAD(BPF_W, lenreg, lenreg, 0));
- off = dt_cg_ctf_offsetof("struct sk_buff", "data_len", NULL, 0);
+ off = dt_cg_ctf_offsetof("struct sk_buff", "data_len", NULL, NULL, 0);
if (dt_regset_xalloc_args(drp) == -1)
longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
@@ -2253,7 +2292,7 @@ dt_cg_act_pcap(dt_pcb_t *pcb, dt_node_t *dnp, dtrace_actkind_t kind)
BPF_STORE(BPF_W, BPF_REG_9, size_off, lenreg));
/* Copy the packet data to the output buffer. */
- off = dt_cg_ctf_offsetof("struct sk_buff", "data", NULL, 0);
+ off = dt_cg_ctf_offsetof("struct sk_buff", "data", NULL, NULL, 0);
if (dt_regset_xalloc_args(drp) == -1)
longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
@@ -4977,11 +5016,11 @@ dt_cg_uregs(unsigned int idx, dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp
char *memnames[] = { "ds", "es", "fsbase", "gsbase", "trap_nr" };
/* Look up task->thread offset. */
- offset = dt_cg_ctf_offsetof("struct task_struct", "thread", NULL, 0);
+ offset = dt_cg_ctf_offsetof("struct task_struct", "thread", NULL, NULL, 0);
/* Add the thread->member offset. */
offset += dt_cg_ctf_offsetof("struct thread_struct",
- memnames[idx - 21], &size, 0);
+ memnames[idx - 21], &size, NULL, 0);
/* Get task. */
if (dt_regset_xalloc_args(drp) == -1)
@@ -5051,7 +5090,7 @@ dt_cg_uregs(unsigned int idx, dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp
/* Copy contents at task->stack to %fp+DT_STK_SP (scratch space). */
emit(dlp, BPF_MOV_REG(BPF_REG_3, BPF_REG_0));
emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_3,
- dt_cg_ctf_offsetof("struct task_struct", "stack", NULL, 0)));
+ dt_cg_ctf_offsetof("struct task_struct", "stack", NULL, NULL, 0)));
emit(dlp, BPF_MOV_IMM(BPF_REG_2, sizeof(uint64_t)));
emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_1, BPF_REG_FP, DT_STK_SP));
emit(dlp, BPF_CALL_HELPER(dtp->dt_bpfhelper[BPF_FUNC_probe_read_kernel]));
diff --git a/libdtrace/dt_cg.h b/libdtrace/dt_cg.h
index 81b79399..3d8d6a9f 100644
--- a/libdtrace/dt_cg.h
+++ b/libdtrace/dt_cg.h
@@ -43,7 +43,9 @@ extern void dt_cg_tramp_epilogue(dt_pcb_t *pcb);
extern void dt_cg_tramp_epilogue_advance(dt_pcb_t *pcb, dt_activity_t act);
extern void dt_cg_tramp_error(dt_pcb_t *pcb);
extern int dt_cg_ctf_offsetof(const char *structname, const char *membername,
- size_t *sizep, int relaxed);
+ size_t *sizep, uint_t *ldopp, int relaxed);
+extern void dt_cg_tramp_get_member(dt_pcb_t *pcb, const char *name, int reg,
+ const char *member);
extern uint_t dt_cg_ldsize(dt_node_t *dnp, ctf_file_t *ctfp, ctf_id_t type,
ssize_t *ret_size);
extern uint_t bpf_ldst_size(ssize_t size, int store);
diff --git a/libdtrace/dt_prov_io.c b/libdtrace/dt_prov_io.c
index 823904d7..fc45870c 100644
--- a/libdtrace/dt_prov_io.c
+++ b/libdtrace/dt_prov_io.c
@@ -181,7 +181,7 @@ static void io_nfs_args_v1(dt_pcb_t *pcb, dt_irlist_t *dlp, uint_t exitlbl,
dt_cg_tramp_get_var(pcb, "this->-io-bio", 1, BPF_REG_6);
/* Fill in bi_opf */
- off = dt_cg_ctf_offsetof("struct bio", "bi_opf", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct bio", "bi_opf", &siz, NULL, 0);
siz = bpf_ldst_size(siz, 1);
if (strstr(uprb, "read"))
emit(dlp, BPF_STORE_IMM(siz, BPF_REG_6, off, REQ_OP_READ));
@@ -198,13 +198,13 @@ static void io_nfs_args_v1(dt_pcb_t *pcb, dt_irlist_t *dlp, uint_t exitlbl,
emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_0, BPF_REG_7, DMST_ARG(2)));
} else {
emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_3, BPF_REG_7, DMST_ARG(1)));
- off = dt_cg_ctf_offsetof("struct nfs_pgio_header", "res", NULL, 0)
- + dt_cg_ctf_offsetof("struct nfs_pgio_res", "count", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct nfs_pgio_header", "res", NULL, NULL, 0)
+ + dt_cg_ctf_offsetof("struct nfs_pgio_res", "count", &siz, NULL, 0);
deref_r3(dlp, exitlbl, off, siz, BPF_REG_0);
}
- off = dt_cg_ctf_offsetof("struct bio", "bi_iter", NULL, 0)
- + dt_cg_ctf_offsetof("struct bvec_iter", "bi_size", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct bio", "bi_iter", NULL, NULL, 0)
+ + dt_cg_ctf_offsetof("struct bvec_iter", "bi_size", &siz, NULL, 0);
siz = bpf_ldst_size(siz, 1);
emit(dlp, BPF_STORE(siz, BPF_REG_6, off, BPF_REG_0));
@@ -218,25 +218,25 @@ static void io_nfs_args_v1(dt_pcb_t *pcb, dt_irlist_t *dlp, uint_t exitlbl,
/* use hdr->inode, hdr is arg1 */
emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_3, BPF_REG_7, DMST_ARG(1)));
- off = dt_cg_ctf_offsetof("struct nfs_pgio_header", "inode", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct nfs_pgio_header", "inode", &siz, NULL, 0);
deref_r3(dlp, exitlbl, off, siz, BPF_REG_3);
}
- off = dt_cg_ctf_offsetof("struct nfs_inode", "fileid", &siz, 0)
- - dt_cg_ctf_offsetof("struct nfs_inode", "vfs_inode", NULL, 0);
+ off = dt_cg_ctf_offsetof("struct nfs_inode", "fileid", &siz, NULL, 0)
+ - dt_cg_ctf_offsetof("struct nfs_inode", "vfs_inode", NULL, NULL, 0);
deref_r3(dlp, exitlbl, off, siz, BPF_REG_0);
- off = dt_cg_ctf_offsetof("struct bio", "bi_iter", NULL, 0)
- + dt_cg_ctf_offsetof("struct bvec_iter", "bi_sector", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct bio", "bi_iter", NULL, NULL, 0)
+ + dt_cg_ctf_offsetof("struct bvec_iter", "bi_sector", &siz, NULL, 0);
siz = bpf_ldst_size(siz, 1);
emit(dlp, BPF_STORE(siz, BPF_REG_6, off, BPF_REG_0));
/*
* bio.bi_bdev = 0;
*/
- off = dt_cg_ctf_offsetof("struct bio", "bi_bdev", &siz, 1);
+ off = dt_cg_ctf_offsetof("struct bio", "bi_bdev", &siz, NULL, 1);
if (off == -1)
- off = dt_cg_ctf_offsetof("struct bio", "bi_disk", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct bio", "bi_disk", &siz, NULL, 0);
siz = bpf_ldst_size(siz, 1);
emit(dlp, BPF_STORE_IMM(siz, BPF_REG_6, off, 0));
@@ -278,7 +278,7 @@ static void io_nfs_args_v2(dt_pcb_t *pcb, dt_irlist_t *dlp, uint_t exitlbl,
dt_cg_tramp_get_var(pcb, "this->-io-bio", 1, BPF_REG_6);
/* Fill in bi_opf */
- off = dt_cg_ctf_offsetof("struct bio", "bi_opf", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct bio", "bi_opf", &siz, NULL, 0);
siz = bpf_ldst_size(siz, 1);
if (strstr(uprb, "read"))
emit(dlp, BPF_STORE_IMM(siz, BPF_REG_6, off, REQ_OP_READ));
@@ -294,16 +294,16 @@ static void io_nfs_args_v2(dt_pcb_t *pcb, dt_irlist_t *dlp, uint_t exitlbl,
*/
if (strcmp(prb, "start") == 0) {
emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_3, BPF_REG_7, DMST_ARG(0)));
- off = dt_cg_ctf_offsetof("struct nfs_pgio_header", "args", NULL, 0)
- + dt_cg_ctf_offsetof("struct nfs_pgio_args", "count", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct nfs_pgio_header", "args", NULL, NULL, 0)
+ + dt_cg_ctf_offsetof("struct nfs_pgio_args", "count", &siz, NULL, 0);
} else {
emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_3, BPF_REG_7, DMST_ARG(1)));
- off = dt_cg_ctf_offsetof("struct nfs_pgio_header", "res", NULL, 0)
- + dt_cg_ctf_offsetof("struct nfs_pgio_res", "count", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct nfs_pgio_header", "res", NULL, NULL, 0)
+ + dt_cg_ctf_offsetof("struct nfs_pgio_res", "count", &siz, NULL, 0);
}
deref_r3(dlp, exitlbl, off, siz, BPF_REG_0);
- off = dt_cg_ctf_offsetof("struct bio", "bi_iter", NULL, 0)
- + dt_cg_ctf_offsetof("struct bvec_iter", "bi_size", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct bio", "bi_iter", NULL, NULL, 0)
+ + dt_cg_ctf_offsetof("struct bvec_iter", "bi_size", &siz, NULL, 0);
siz = bpf_ldst_size(siz, 1);
emit(dlp, BPF_STORE(siz, BPF_REG_6, off, BPF_REG_0));
@@ -316,25 +316,25 @@ static void io_nfs_args_v2(dt_pcb_t *pcb, dt_irlist_t *dlp, uint_t exitlbl,
else
emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_3, BPF_REG_7, DMST_ARG(1)));
- off = dt_cg_ctf_offsetof("struct nfs_pgio_header", "inode", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct nfs_pgio_header", "inode", &siz, NULL, 0);
deref_r3(dlp, exitlbl, off, siz, BPF_REG_3);
- off = dt_cg_ctf_offsetof("struct nfs_inode", "fileid", &siz, 0)
- - dt_cg_ctf_offsetof("struct nfs_inode", "vfs_inode", NULL, 0);
+ off = dt_cg_ctf_offsetof("struct nfs_inode", "fileid", &siz, NULL, 0)
+ - dt_cg_ctf_offsetof("struct nfs_inode", "vfs_inode", NULL, NULL, 0);
deref_r3(dlp, exitlbl, off, siz, BPF_REG_0);
- off = dt_cg_ctf_offsetof("struct bio", "bi_iter", NULL, 0)
- + dt_cg_ctf_offsetof("struct bvec_iter", "bi_sector", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct bio", "bi_iter", NULL, NULL, 0)
+ + dt_cg_ctf_offsetof("struct bvec_iter", "bi_sector", &siz, NULL, 0);
siz = bpf_ldst_size(siz, 1);
emit(dlp, BPF_STORE(siz, BPF_REG_6, off, BPF_REG_0));
/*
* bio.bi_bdev = 0;
*/
- off = dt_cg_ctf_offsetof("struct bio", "bi_bdev", &siz, 1);
+ off = dt_cg_ctf_offsetof("struct bio", "bi_bdev", &siz, NULL, 1);
if (off == -1)
- off = dt_cg_ctf_offsetof("struct bio", "bi_disk", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct bio", "bi_disk", &siz, NULL, 0);
siz = bpf_ldst_size(siz, 1);
emit(dlp, BPF_STORE_IMM(siz, BPF_REG_6, off, 0));
@@ -379,14 +379,14 @@ static void io_xfs_args(dt_pcb_t *pcb, dt_irlist_t *dlp, uint_t exitlbl)
/* bio.bi_opf = (bp->b_flags & XBF_WRITE) ? REQ_OP_WRITE : REQ_OP_READ; */
emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_3, BPF_REG_7, DMST_ARG(0)));
- off = dt_cg_ctf_offsetof("struct xfs_buf", "b_flags", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct xfs_buf", "b_flags", &siz, NULL, 0);
deref_r3(dlp, exitlbl, off, siz, BPF_REG_0);
emit(dlp, BPF_ALU64_IMM(BPF_AND, BPF_REG_0, XBF_WRITE));
{
uint_t Lzero = dt_irlist_label(dlp);
uint_t Ldone = dt_irlist_label(dlp);
- off = dt_cg_ctf_offsetof("struct bio", "bi_opf", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct bio", "bi_opf", &siz, NULL, 0);
siz = bpf_ldst_size(siz, 1);
emit(dlp, BPF_BRANCH_IMM(BPF_JEQ, BPF_REG_0, 0, Lzero));
@@ -403,10 +403,10 @@ static void io_xfs_args(dt_pcb_t *pcb, dt_irlist_t *dlp, uint_t exitlbl)
* bio.bi_iter.bi_size = bp->b_length;
*/
emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_3, BPF_REG_7, DMST_ARG(0)));
- off = dt_cg_ctf_offsetof("struct xfs_buf", "b_length", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct xfs_buf", "b_length", &siz, NULL, 0);
deref_r3(dlp, exitlbl, off, siz, BPF_REG_0);
- off = dt_cg_ctf_offsetof("struct bio", "bi_iter", NULL, 0)
- + dt_cg_ctf_offsetof("struct bvec_iter", "bi_size", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct bio", "bi_iter", NULL, NULL, 0)
+ + dt_cg_ctf_offsetof("struct bvec_iter", "bi_size", &siz, NULL, 0);
siz = bpf_ldst_size(siz, 1);
emit(dlp, BPF_STORE(siz, BPF_REG_6, off, BPF_REG_0));
@@ -446,12 +446,12 @@ static void io_xfs_args(dt_pcb_t *pcb, dt_irlist_t *dlp, uint_t exitlbl)
* }
*/
emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_3, BPF_REG_7, DMST_ARG(0)));
- off = dt_cg_ctf_offsetof("struct xfs_buf", "b_maps", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct xfs_buf", "b_maps", &siz, NULL, 0);
deref_r3(dlp, exitlbl, off, siz, BPF_REG_3);
- off = dt_cg_ctf_offsetof("struct xfs_buf_map", "bm_bn", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct xfs_buf_map", "bm_bn", &siz, NULL, 0);
deref_r3(dlp, exitlbl, off, siz, BPF_REG_0);
- off = dt_cg_ctf_offsetof("struct bio", "bi_iter", NULL, 0)
- + dt_cg_ctf_offsetof("struct bvec_iter", "bi_sector", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct bio", "bi_iter", NULL, NULL, 0)
+ + dt_cg_ctf_offsetof("struct bvec_iter", "bi_sector", &siz, NULL, 0);
siz = bpf_ldst_size(siz, 1);
emit(dlp, BPF_STORE(siz, BPF_REG_6, off, BPF_REG_0));
@@ -459,24 +459,24 @@ static void io_xfs_args(dt_pcb_t *pcb, dt_irlist_t *dlp, uint_t exitlbl)
* bio.bi_bdev = (bp)->b_target->bt_bdev
*/
emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_3, BPF_REG_7, DMST_ARG(0)));
- off = dt_cg_ctf_offsetof("struct xfs_buf", "b_target", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct xfs_buf", "b_target", &siz, NULL, 0);
assert(siz == sizeof(void *));
deref_r3(dlp, exitlbl, off, 8, BPF_REG_3);
- off = dt_cg_ctf_offsetof("struct xfs_buftarg", "bt_bdev", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct xfs_buftarg", "bt_bdev", &siz, NULL, 0);
deref_r3(dlp, exitlbl, off, siz, BPF_REG_3);
- off = dt_cg_ctf_offsetof("struct bio", "bi_bdev", &siz, 1);
+ off = dt_cg_ctf_offsetof("struct bio", "bi_bdev", &siz, NULL, 1);
if (off == -1)
- off = dt_cg_ctf_offsetof("struct bio", "bi_disk", &siz, 0);
+ off = dt_cg_ctf_offsetof("struct bio", "bi_disk", &siz, NULL, 0);
siz = bpf_ldst_size(siz, 1);
emit(dlp, BPF_STORE(siz, BPF_REG_6, off, BPF_REG_0));
/* Populate bi_partno if it exists. */
- off = dt_cg_ctf_offsetof("struct bio", "bi_partno", &siz, 1);
+ off = dt_cg_ctf_offsetof("struct bio", "bi_partno", &siz, NULL, 1);
if (off >= 0) {
int poff;
size_t psiz;
- poff = dt_cg_ctf_offsetof("struct block_device", "bd_partno", &psiz, 0);
+ poff = dt_cg_ctf_offsetof("struct block_device", "bd_partno", &psiz, NULL, 0);
siz = bpf_ldst_size(siz, 1);
deref_r3(dlp, exitlbl, poff, psiz, BPF_REG_0);
emit(dlp, BPF_STORE(siz, BPF_REG_6, off, BPF_REG_0));
@@ -542,7 +542,7 @@ static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
size_t size;
size_t off;
- off = dt_cg_ctf_offsetof("struct request", "bio", &size, 0);
+ off = dt_cg_ctf_offsetof("struct request", "bio", &size, NULL, 0);
emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_3, BPF_REG_7, DMST_ARG(0)));
deref_r3(dlp, exitlbl, off, size, BPF_REG_0);
diff --git a/libdtrace/dt_prov_ip.c b/libdtrace/dt_prov_ip.c
index c4a3a6e2..922cfd8d 100644
--- a/libdtrace/dt_prov_ip.c
+++ b/libdtrace/dt_prov_ip.c
@@ -62,43 +62,6 @@ static int populate(dtrace_hdl_t *dtp)
probe_args, probes);
}
-/*
- * Retrieve the value of a member in a given struct.
- *
- * Entry:
- * reg = TYPE *ptr
- *
- * Return:
- * %r0 = ptr->member
- * Clobbers:
- * %r1 .. %r5
- */
-static int get_member(dt_pcb_t *pcb, const char *name, int reg,
- const char *member) {
- dtrace_hdl_t *dtp = pcb->pcb_hdl;
- dt_irlist_t *dlp = &pcb->pcb_ir;
- dtrace_typeinfo_t tt;
- ctf_membinfo_t ctm;
- size_t size;
- uint_t ldop;
-
- if (dtrace_lookup_by_type(dtp, DTRACE_OBJ_KMODS, name, &tt) == -1 ||
- ctf_member_info(tt.dtt_ctfp, tt.dtt_type, member, &ctm) == CTF_ERR)
- return -1;
-
- ldop = dt_cg_ldsize(NULL, tt.dtt_ctfp, ctm.ctm_type, &size);
-
- emit(dlp, BPF_MOV_REG(BPF_REG_3, reg));
- emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, ctm.ctm_offset / NBBY));
- emit(dlp, BPF_MOV_IMM(BPF_REG_2, size));
- emit(dlp, BPF_MOV_REG(BPF_REG_1, BPF_REG_FP));
- emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, DT_TRAMP_SP_BASE));
- emit(dlp, BPF_CALL_HELPER(dtp->dt_bpfhelper[BPF_FUNC_probe_read_kernel]));
- emit(dlp, BPF_LOAD(ldop, BPF_REG_0, BPF_REG_FP, DT_TRAMP_SP_BASE));
-
- return 0;
-}
-
/*
* Generate a BPF trampoline for a SDT probe.
*
@@ -142,7 +105,7 @@ static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_ARG(0), BPF_REG_6));
- get_member(pcb, "struct sk_buff", BPF_REG_6, "sk");
+ dt_cg_tramp_get_member(pcb, "struct sk_buff", BPF_REG_6, "sk");
emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_ARG(1), BPF_REG_0));
/*
@@ -150,11 +113,11 @@ static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
* skb_network_header(skb) = (include/linux/ip.h)
* skb->head + skb->network_header (include/linux/skbuff.h)
*/
- get_member(pcb, "struct sk_buff", BPF_REG_6, "head");
+ dt_cg_tramp_get_member(pcb, "struct sk_buff", BPF_REG_6, "head");
emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_ARG(2), BPF_REG_0));
emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_ARG(4), BPF_REG_0));
emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_ARG(5), BPF_REG_0));
- get_member(pcb, "struct sk_buff", BPF_REG_6, "network_header");
+ dt_cg_tramp_get_member(pcb, "struct sk_buff", BPF_REG_6, "network_header");
emit(dlp, BPF_XADD_REG(BPF_DW, BPF_REG_7, DMST_ARG(2), BPF_REG_0));
emit(dlp, BPF_XADD_REG(BPF_DW, BPF_REG_7, DMST_ARG(4), BPF_REG_0));
emit(dlp, BPF_XADD_REG(BPF_DW, BPF_REG_7, DMST_ARG(5), BPF_REG_0));
@@ -168,7 +131,7 @@ static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
else
emit(dlp, BPF_STORE_IMM(BPF_DW, BPF_REG_7, DMST_ARG(5), 0));
- get_member(pcb, "struct sk_buff", BPF_REG_6, "dev");
+ dt_cg_tramp_get_member(pcb, "struct sk_buff", BPF_REG_6, "dev");
emit(dlp, BPF_STORE(BPF_DW, BPF_REG_7, DMST_ARG(3), BPF_REG_0));
return 0;
diff --git a/libdtrace/dt_prov_proc.c b/libdtrace/dt_prov_proc.c
index 15fde6c9..cf08ce7f 100644
--- a/libdtrace/dt_prov_proc.c
+++ b/libdtrace/dt_prov_proc.c
@@ -206,7 +206,7 @@ static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
emit(dlp, BPF_BRANCH_IMM(BPF_JNE, BPF_REG_0, SIGKILL, lbl_keep));
emit(dlp, BPF_CALL_HELPER(BPF_FUNC_get_current_task));
- off = dt_cg_ctf_offsetof("struct task_struct", "signal", &sz, 0);
+ off = dt_cg_ctf_offsetof("struct task_struct", "signal", &sz, NULL, 0);
emit(dlp, BPF_MOV_REG(BPF_REG_3, BPF_REG_0));
emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, off));
emit(dlp, BPF_MOV_REG(BPF_REG_1, BPF_REG_FP));
@@ -214,7 +214,7 @@ static int trampoline(dt_pcb_t *pcb, uint_t exitlbl)
emit(dlp, BPF_MOV_IMM(BPF_REG_2, sz));
emit(dlp, BPF_CALL_HELPER(BPF_FUNC_probe_read));
emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_3, BPF_REG_FP, DT_TRAMP_SP_SLOT(0)));
- off = dt_cg_ctf_offsetof("struct signal_struct", "group_exit_code", &sz, 0);
+ off = dt_cg_ctf_offsetof("struct signal_struct", "group_exit_code", &sz, NULL, 0);
emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, off));
emit(dlp, BPF_MOV_REG(BPF_REG_1, BPF_REG_FP));
emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, DT_TRAMP_SP_SLOT(0)));
diff --git a/libdtrace/dt_prov_sched.c b/libdtrace/dt_prov_sched.c
index a548e679..25f745c1 100644
--- a/libdtrace/dt_prov_sched.c
+++ b/libdtrace/dt_prov_sched.c
@@ -101,7 +101,7 @@ static void get_cpuinfo(dtrace_hdl_t *dtp, dt_irlist_t *dlp, uint_t exitlbl)
emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_3, BPF_REG_7, DMST_ARG(0)));
/* Turn it into a pointer to its cpu member. */
- emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, dt_cg_ctf_offsetof("struct rq", "cpu", NULL, 1)));
+ emit(dlp, BPF_ALU64_IMM(BPF_ADD, BPF_REG_3, dt_cg_ctf_offsetof("struct rq", "cpu", NULL, NULL, 1)));
/* Call bpf_probe_read_kernel(%fp + DT_TRAMP_SP_SLOT[0], sizeof(int), %r3) */
emit(dlp, BPF_MOV_IMM(BPF_REG_2, (int) sizeof(int)));
diff --git a/libdtrace/dt_prov_uprobe.c b/libdtrace/dt_prov_uprobe.c
index cf5cfd43..0b60bf57 100644
--- a/libdtrace/dt_prov_uprobe.c
+++ b/libdtrace/dt_prov_uprobe.c
@@ -250,11 +250,11 @@ get_asm_reg(dt_provider_t *pvp, const char *name)
i++, rp++) {
#if defined(__amd64)
rp->off = dt_cg_ctf_offsetof("struct pt_regs",
- rp->mname, NULL, 0) +
+ rp->mname, NULL, NULL, 0) +
rp->moff;
#elif defined(__aarch64__)
rp->off = dt_cg_ctf_offsetof("struct user_pt_regs",
- rp->mname, NULL, 0) +
+ rp->mname, NULL, NULL, 0) +
rp->moff;
#endif
--
2.43.5
More information about the DTrace-devel
mailing list