[DTrace-devel] [PATCH 14/14] Fix string disasm due to new code path
eugene.loh at oracle.com
eugene.loh at oracle.com
Tue May 2 03:47:22 UTC 2023
From: Eugene Loh <eugene.loh at oracle.com>
Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
---
libdtrace/dt_dis.c | 15 ++++++----
test/unittest/disasm/tst.ann-str_assoc.r | 2 ++
test/unittest/disasm/tst.ann-str_assoc.sh | 19 +++++++++++++
test/unittest/disasm/tst.ann-str_gvar.r | 4 +++
test/unittest/disasm/tst.ann-str_gvar.sh | 34 +++++++++++++++++++++++
test/unittest/disasm/tst.ann-str_lvar.r | 4 +++
test/unittest/disasm/tst.ann-str_lvar.sh | 34 +++++++++++++++++++++++
test/unittest/disasm/tst.ann-str_tvar.r | 2 ++
test/unittest/disasm/tst.ann-str_tvar.sh | 19 +++++++++++++
9 files changed, 128 insertions(+), 5 deletions(-)
create mode 100644 test/unittest/disasm/tst.ann-str_assoc.r
create mode 100755 test/unittest/disasm/tst.ann-str_assoc.sh
create mode 100644 test/unittest/disasm/tst.ann-str_gvar.r
create mode 100755 test/unittest/disasm/tst.ann-str_gvar.sh
create mode 100644 test/unittest/disasm/tst.ann-str_lvar.r
create mode 100755 test/unittest/disasm/tst.ann-str_lvar.sh
create mode 100644 test/unittest/disasm/tst.ann-str_tvar.r
create mode 100755 test/unittest/disasm/tst.ann-str_tvar.sh
diff --git a/libdtrace/dt_dis.c b/libdtrace/dt_dis.c
index 1cfcaf5d..bb2260e3 100644
--- a/libdtrace/dt_dis.c
+++ b/libdtrace/dt_dis.c
@@ -92,7 +92,7 @@ dt_dis_varname_off(const dtrace_difo_t *dp, uint_t off, uint_t scope, uint_t add
* insn code dst src offset imm
* -2: ld dst %fp DT_STK_DCTX 00000000
* -1: ld dst dst DCTX_*VARS 00000000
- * 0: ld dst dst var_offset 00000000
+ * 0: ld xxx dst var_offset 00000000
* 0: st dst src var_offset 00000000
* 0: add dst 0 0 var_offset
* where instruction 0 is the current instruction, which may be one
@@ -151,10 +151,11 @@ dt_dis_refname(const dtrace_difo_t *dp, const struct bpf_insn *in, uint_t addr,
goto out;
/* check the current instruction and read var_offset */
- if (in->dst_reg != dst)
- goto out;
if (in[-1].off == DCTX_STRTAB) {
- if (in->code == addcode && in->src_reg == 0 && in->off == 0) {
+ if (in->dst_reg == dst &&
+ in->code == addcode &&
+ in->src_reg == 0 &&
+ in->off == 0) {
str = dt_difo_getstr(dp, in->imm);
if (str != NULL)
fprintf(fp, "%*s! \"%s\"", DT_DIS_PAD(n), "",
@@ -168,9 +169,13 @@ dt_dis_refname(const dtrace_difo_t *dp, const struct bpf_insn *in, uint_t addr,
var_offset = in->off;
else if (BPF_CLASS(in->code) == BPF_STX &&
BPF_MODE(in->code) == BPF_MEM &&
+ in->dst_reg == dst &&
in->src_reg != dst && in->imm == 0)
var_offset = in->off;
- else if (in->code == addcode && in->src_reg == 0 && in->off == 0)
+ else if (in->code == addcode &&
+ in->dst_reg == dst &&
+ in->src_reg == 0 &&
+ in->off == 0)
var_offset = in->imm;
else
goto out;
diff --git a/test/unittest/disasm/tst.ann-str_assoc.r b/test/unittest/disasm/tst.ann-str_assoc.r
new file mode 100644
index 00000000..aa9c1ef7
--- /dev/null
+++ b/test/unittest/disasm/tst.ann-str_assoc.r
@@ -0,0 +1,2 @@
+85 0 1 0000 ffffffff call dt_get_assoc ! CheckVariable[]
+85 0 1 0000 ffffffff call dt_get_assoc ! CheckVariable[]
diff --git a/test/unittest/disasm/tst.ann-str_assoc.sh b/test/unittest/disasm/tst.ann-str_assoc.sh
new file mode 100755
index 00000000..05d42705
--- /dev/null
+++ b/test/unittest/disasm/tst.ann-str_assoc.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+#
+# Oracle Linux DTrace.
+# Copyright (c) 2023, 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.
+#
+
+dtrace=$1
+
+$dtrace $dt_flags -Sen '
+BEGIN
+{
+ CheckVariable[1234] = "abc";
+ trace(CheckVariable[1234]);
+}
+' 2>&1 | awk '/ call dt_get_assoc/ { sub(/^[^:]+: /, ""); print; }'
+
+exit $?
diff --git a/test/unittest/disasm/tst.ann-str_gvar.r b/test/unittest/disasm/tst.ann-str_gvar.r
new file mode 100644
index 00000000..b1644015
--- /dev/null
+++ b/test/unittest/disasm/tst.ann-str_gvar.r
@@ -0,0 +1,4 @@
+07 N N 0000 00000000 add %rX, 0 ! CheckVariable
+6a N N 0000 00000000 sth [%rX+0], 0
+69 N N 0000 00000000 ldh %rX, [%rX+0] ! CheckVariable
+55 N N 0002 00007f00 jne %rX, 32512, 2 ! -> NNN
diff --git a/test/unittest/disasm/tst.ann-str_gvar.sh b/test/unittest/disasm/tst.ann-str_gvar.sh
new file mode 100755
index 00000000..4ceef299
--- /dev/null
+++ b/test/unittest/disasm/tst.ann-str_gvar.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+#
+# Oracle Linux DTrace.
+# Copyright (c) 2023, 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.
+#
+
+dtrace=$1
+
+$dtrace $dt_flags -Sen '
+BEGIN
+{
+ CheckVariable = "abc";
+ trace(CheckVariable);
+}
+' 2>&1 | awk '/ CheckV/ {
+ sub(/^[^:]+: /, ""); # strip line number
+ gsub(/%r[0-9]/, "%rX"); # hide reg numbers
+ $2 = "N";
+ $3 = "N";
+ print;
+
+ getline;
+
+ sub(/^[^:]+: /, ""); # strip line number
+ gsub(/%r[0-9]/, "%rX"); # hide reg numbers
+ $2 = "N";
+ $3 = "N";
+ sub(/ +! -> [0-9a-f]*/, " ! -> NNN"); # hide branch targets
+ print;
+ }'
+
+exit $?
diff --git a/test/unittest/disasm/tst.ann-str_lvar.r b/test/unittest/disasm/tst.ann-str_lvar.r
new file mode 100644
index 00000000..704cc143
--- /dev/null
+++ b/test/unittest/disasm/tst.ann-str_lvar.r
@@ -0,0 +1,4 @@
+07 N N 0000 00000000 add %rX, 0 ! this->CheckVariable
+6a N N 0000 00000000 sth [%rX+0], 0
+69 N N 0000 00000000 ldh %rX, [%rX+0] ! this->CheckVariable
+55 N N 0002 00007f00 jne %rX, 32512, 2 ! -> NNN
diff --git a/test/unittest/disasm/tst.ann-str_lvar.sh b/test/unittest/disasm/tst.ann-str_lvar.sh
new file mode 100755
index 00000000..90f91c0a
--- /dev/null
+++ b/test/unittest/disasm/tst.ann-str_lvar.sh
@@ -0,0 +1,34 @@
+#!/bin/bash
+#
+# Oracle Linux DTrace.
+# Copyright (c) 2023, 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.
+#
+
+dtrace=$1
+
+$dtrace $dt_flags -Sen '
+BEGIN
+{
+ this->CheckVariable = "abc";
+ trace(this->CheckVariable);
+}
+' 2>&1 | awk '/this->CheckV/ {
+ sub(/^[^:]+: /, ""); # strip line number
+ gsub(/%r[0-9]/, "%rX"); # hide reg numbers
+ $2 = "N";
+ $3 = "N";
+ print;
+
+ getline;
+
+ sub(/^[^:]+: /, ""); # strip line number
+ gsub(/%r[0-9]/, "%rX"); # hide reg numbers
+ $2 = "N";
+ $3 = "N";
+ sub(/ +! -> [0-9a-f]*/, " ! -> NNN"); # hide branch targets
+ print;
+ }'
+
+exit $?
diff --git a/test/unittest/disasm/tst.ann-str_tvar.r b/test/unittest/disasm/tst.ann-str_tvar.r
new file mode 100644
index 00000000..63b7b77c
--- /dev/null
+++ b/test/unittest/disasm/tst.ann-str_tvar.r
@@ -0,0 +1,2 @@
+85 0 1 0000 ffffffff call dt_get_tvar ! self->CheckVariable
+85 0 1 0000 ffffffff call dt_get_tvar ! self->CheckVariable
diff --git a/test/unittest/disasm/tst.ann-str_tvar.sh b/test/unittest/disasm/tst.ann-str_tvar.sh
new file mode 100755
index 00000000..ebbdf8be
--- /dev/null
+++ b/test/unittest/disasm/tst.ann-str_tvar.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+#
+# Oracle Linux DTrace.
+# Copyright (c) 2023, 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.
+#
+
+dtrace=$1
+
+$dtrace $dt_flags -Sen '
+BEGIN
+{
+ self->CheckVariable = "abc";
+ trace(self->CheckVariable);
+}
+' 2>&1 | awk '/ call dt_get_tvar/ { sub(/^[^:]+: /, ""); print; }'
+
+exit $?
--
2.18.4
More information about the DTrace-devel
mailing list