[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