[DTrace-devel] [PATCH 02/12] cg: Dummy implementation for d_path()
Kris Van Hees
kris.van.hees at oracle.com
Fri Jan 5 05:24:41 UTC 2024
Hardwire d_path() to always return "<unknown>" pending an implementation
that really works. This stub allows io and procfs translators to work.
Tests that will have their expected output adjusted for this stub will
FAIL when a real implementation is introduced, and should be adjusted at
that time.
Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
libdtrace/dt_cg.c | 34 +++++++++++++++++++++++++++++-
test/unittest/io/tst.fds.aarch64.r | 20 +++++++++---------
test/unittest/io/tst.fds.d | 3 +--
test/unittest/io/tst.fds.sparc64.r | 20 +++++++++---------
test/unittest/io/tst.fds.x86_64.r | 20 +++++++++---------
5 files changed, 64 insertions(+), 33 deletions(-)
diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 4332954e..30b1da16 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -6257,6 +6257,38 @@ dt_cg_subr_inet_ntop(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
tnp->dn_tstring = NULL;
}
+static void
+dt_cg_subr_d_path(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
+{
+ dt_node_t *arg = dnp->dn_args;
+
+ dt_cg_node(arg, dlp, drp);
+ dt_cg_check_ptr_arg(dlp, drp, arg, NULL);
+
+ /* Allocate a temporary string for the result. */
+ dnp->dn_reg = dt_regset_alloc(drp);
+ if (dnp->dn_reg == -1)
+ longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
+ dt_cg_tstring_alloc(yypcb, dnp);
+ emit(dlp, BPF_LOAD(BPF_DW, dnp->dn_reg, BPF_REG_FP, DT_STK_DCTX));
+ emit(dlp, BPF_LOAD(BPF_DW, dnp->dn_reg, dnp->dn_reg, DCTX_MEM));
+ emit(dlp, BPF_ALU64_IMM(BPF_ADD, dnp->dn_reg, dnp->dn_tstring->dn_value));
+
+ /*
+ * We do not have a real implementation yet, so throw away the result
+ * of evaluating the argument, and return a default value "<unknown>"
+ * in a temporary string.
+ *
+ * <unknown> is 3c 75 6e 6b 6e 6f 77 6e 3e 00
+ */
+ dt_regset_free(drp, arg->dn_reg);
+ dt_cg_tstring_free(yypcb, arg);
+
+ emit(dlp, BPF_STORE_IMM(BPF_W, dnp->dn_reg, 0, 0x6b6e753c));
+ emit(dlp, BPF_STORE_IMM(BPF_W, dnp->dn_reg, 4, 0x6e776f6e));
+ emit(dlp, BPF_STORE_IMM(BPF_H, dnp->dn_reg, 8, 0x003e));
+}
+
static void
dt_cg_subr_link_ntop(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
{
@@ -6323,7 +6355,7 @@ static dt_cg_subr_f *_dt_cg_subr[DIF_SUBR_MAX + 1] = {
[DIF_SUBR_INET_NTOP] = &dt_cg_subr_inet_ntop,
[DIF_SUBR_INET_NTOA] = &dt_cg_subr_inet_ntoa,
[DIF_SUBR_INET_NTOA6] = &dt_cg_subr_inet_ntoa6,
- [DIF_SUBR_D_PATH] = NULL,
+ [DIF_SUBR_D_PATH] = &dt_cg_subr_d_path,
[DIF_SUBR_LINK_NTOP] = &dt_cg_subr_link_ntop,
};
diff --git a/test/unittest/io/tst.fds.aarch64.r b/test/unittest/io/tst.fds.aarch64.r
index e953785c..e1160e5d 100644
--- a/test/unittest/io/tst.fds.aarch64.r
+++ b/test/unittest/io/tst.fds.aarch64.r
@@ -1,31 +1,31 @@
-fds[0] fi_dirname = /proc/#
+fds[0] fi_dirname = .
fds[0] fi_mount = <unknown>
fds[0] fi_name = mem
fds[0] fi_offset = 0
fds[0] fi_oflags = 20000
-fds[0] fi_pathname = /proc/#/mem
-fds[1] fi_dirname = /proc/#
+fds[0] fi_pathname = <unknown>
+fds[1] fi_dirname = .
fds[1] fi_mount = <unknown>
fds[1] fi_name = mem
fds[1] fi_offset = 0
fds[1] fi_oflags = 20001
-fds[1] fi_pathname = /proc/#/mem
-fds[2] fi_dirname = /proc/#
+fds[1] fi_pathname = <unknown>
+fds[2] fi_dirname = .
fds[2] fi_mount = <unknown>
fds[2] fi_name = mem
fds[2] fi_offset = 0
fds[2] fi_oflags = 20002
-fds[2] fi_pathname = /proc/#/mem
-fds[3] fi_dirname = /proc/#
+fds[2] fi_pathname = <unknown>
+fds[3] fi_dirname = .
fds[3] fi_mount = <unknown>
fds[3] fi_name = mem
fds[3] fi_offset = 0
fds[3] fi_oflags = 121c02
-fds[3] fi_pathname = /proc/#/mem
-fds[4] fi_dirname = /proc/#
+fds[3] fi_pathname = <unknown>
+fds[4] fi_dirname = .
fds[4] fi_mount = <unknown>
fds[4] fi_name = mem
fds[4] fi_offset = 123
fds[4] fi_oflags = 20002
-fds[4] fi_pathname = /proc/#/mem
+fds[4] fi_pathname = <unknown>
diff --git a/test/unittest/io/tst.fds.d b/test/unittest/io/tst.fds.d
index b762e6ac..06caefe4 100644
--- a/test/unittest/io/tst.fds.d
+++ b/test/unittest/io/tst.fds.d
@@ -1,11 +1,10 @@
/*
* Oracle Linux DTrace.
- * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 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.
*/
-/* @@xfail: dtv2 */
/* @@trigger: bogus-ioctl */
/* @@trigger-timing: after */
/* @@runtest-opts: -C $_pid */
diff --git a/test/unittest/io/tst.fds.sparc64.r b/test/unittest/io/tst.fds.sparc64.r
index d787a14b..71cc8309 100644
--- a/test/unittest/io/tst.fds.sparc64.r
+++ b/test/unittest/io/tst.fds.sparc64.r
@@ -1,31 +1,31 @@
-fds[0] fi_dirname = /proc/#
+fds[0] fi_dirname = .
fds[0] fi_mount = <unknown>
fds[0] fi_name = mem
fds[0] fi_offset = 0
fds[0] fi_oflags = 40000
-fds[0] fi_pathname = /proc/#/mem
-fds[1] fi_dirname = /proc/#
+fds[0] fi_pathname = <unknown>
+fds[1] fi_dirname = .
fds[1] fi_mount = <unknown>
fds[1] fi_name = mem
fds[1] fi_offset = 0
fds[1] fi_oflags = 40001
-fds[1] fi_pathname = /proc/#/mem
-fds[2] fi_dirname = /proc/#
+fds[1] fi_pathname = <unknown>
+fds[2] fi_dirname = .
fds[2] fi_mount = <unknown>
fds[2] fi_name = mem
fds[2] fi_offset = 0
fds[2] fi_oflags = 40002
-fds[2] fi_pathname = /proc/#/mem
-fds[3] fi_dirname = /proc/#
+fds[2] fi_pathname = <unknown>
+fds[3] fi_dirname = .
fds[3] fi_mount = <unknown>
fds[3] fi_name = mem
fds[3] fi_offset = 0
fds[3] fi_oflags = 84600e
-fds[3] fi_pathname = /proc/#/mem
-fds[4] fi_dirname = /proc/#
+fds[3] fi_pathname = <unknown>
+fds[4] fi_dirname = .
fds[4] fi_mount = <unknown>
fds[4] fi_name = mem
fds[4] fi_offset = 123
fds[4] fi_oflags = 40002
-fds[4] fi_pathname = /proc/#/mem
+fds[4] fi_pathname = <unknown>
diff --git a/test/unittest/io/tst.fds.x86_64.r b/test/unittest/io/tst.fds.x86_64.r
index ec42330c..799e8562 100644
--- a/test/unittest/io/tst.fds.x86_64.r
+++ b/test/unittest/io/tst.fds.x86_64.r
@@ -1,31 +1,31 @@
-fds[0] fi_dirname = /proc/#
+fds[0] fi_dirname = .
fds[0] fi_mount = <unknown>
fds[0] fi_name = mem
fds[0] fi_offset = 0
fds[0] fi_oflags = 8000
-fds[0] fi_pathname = /proc/#/mem
-fds[1] fi_dirname = /proc/#
+fds[0] fi_pathname = <unknown>
+fds[1] fi_dirname = .
fds[1] fi_mount = <unknown>
fds[1] fi_name = mem
fds[1] fi_offset = 0
fds[1] fi_oflags = 8001
-fds[1] fi_pathname = /proc/#/mem
-fds[2] fi_dirname = /proc/#
+fds[1] fi_pathname = <unknown>
+fds[2] fi_dirname = .
fds[2] fi_mount = <unknown>
fds[2] fi_name = mem
fds[2] fi_offset = 0
fds[2] fi_oflags = 8002
-fds[2] fi_pathname = /proc/#/mem
-fds[3] fi_dirname = /proc/#
+fds[2] fi_pathname = <unknown>
+fds[3] fi_dirname = .
fds[3] fi_mount = <unknown>
fds[3] fi_name = mem
fds[3] fi_offset = 0
fds[3] fi_oflags = 109c02
-fds[3] fi_pathname = /proc/#/mem
-fds[4] fi_dirname = /proc/#
+fds[3] fi_pathname = <unknown>
+fds[4] fi_dirname = .
fds[4] fi_mount = <unknown>
fds[4] fi_name = mem
fds[4] fi_offset = 123
fds[4] fi_oflags = 8002
-fds[4] fi_pathname = /proc/#/mem
+fds[4] fi_pathname = <unknown>
--
2.42.0
More information about the DTrace-devel
mailing list