[DTrace-devel] [PATCH 01/12] Support loading scalars from kernel addresses

Kris Van Hees kris.van.hees at oracle.com
Wed Jul 13 19:17:33 UTC 2022


Data access for non-scalar datatypes was implemented using the
probe_read() BPF helper while scalar datatypes were accessed using
load and store instructions.  When loading scalar data from kernel
addresses, a load instruction cannot be used.  This patch ensures
that such accesses use the probe_read() BPF helper.  (Storing to
kernel addresses is not supported by DTrace so that case does not
need special handling.)

The new dt_cg_load_scalar() function implements the scalar kernel
access.

A new node flag is introduced: DT_NF_DPTR.  It is set for any pointer
that is known to be an internal pointer (i.e. address of a location
in a BPF map managed by DTrace).  Such pointers can be dereferenced
with a load instruction.  All other cases use dt_cg_load_scalar().
The DT_NF_DPTR is propagated across =, +, and -.

Comments and code about DT_NF_USERLAND save/restore across dt_cg_ldsize()
has been removed - it is no longer relevant.

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_cg.c                             | 76 +++++++++----------
 libdtrace/dt_parser.c                         | 43 +++++++----
 libdtrace/dt_parser.h                         |  1 +
 test/unittest/arrays/tst.ctf-bounds.d         |  1 -
 .../unittest/arrays/tst.ctf-bounds.oob-cast.d |  1 -
 .../arrays/tst.declared-bounds.oob-cast.d     |  1 -
 test/unittest/builtinvar/tst.hpriority.d      |  1 -
 test/unittest/builtinvar/tst.lwpsinfo.d       |  1 -
 test/unittest/builtinvar/tst.lwpsinfo1.d      |  1 -
 .../tst.kernel_read_deref_indirect_scalar.d   | 20 +++++
 .../tst.kernel_read_deref_indirect_str.d      | 18 +++++
 .../codegen/tst.kernel_read_deref_struct.d    | 19 +++++
 .../tst.kernel_read_index_indirect_str.d      | 21 +++++
 .../codegen/tst.kernel_read_indirect_scalar.d | 19 +++++
 test/unittest/codegen/tst.kernel_read_mixed.d | 18 +++++
 .../unittest/codegen/tst.kernel_read_scalar.d | 19 +++++
 test/unittest/codegen/tst.kernel_read_str.d   | 19 +++++
 .../codegen/tst.read_index_indirect_str.d     | 21 +++++
 test/unittest/funcs/tst.bcopy.d               |  8 +-
 test/unittest/inline/tst.InlineTypedef.d      |  1 -
 test/unittest/lexer/tst.keyword-member.d      |  1 -
 test/unittest/pointers/tst.ArrayPointer2.d    |  1 -
 test/unittest/pointers/tst.ArrayPointer3.d    |  1 -
 test/unittest/pointers/tst.GlobalVar.d        |  1 -
 .../pointers/tst.IntegerArithmetic1.d         |  1 -
 .../pointers/tst.PointerArithmetic2.d         |  1 -
 test/unittest/pointers/tst.VoidCast.d         |  1 -
 test/unittest/pointers/tst.basic1.d           |  1 -
 test/unittest/printf/tst.str.d                |  3 +-
 test/unittest/sched/tst.var-curcpu.d          |  1 -
 test/unittest/trace/tst.misc.d                |  1 -
 .../translators/tst.TestTransStability.d      |  1 -
 test/unittest/vars/tst.gid.d                  |  1 -
 33 files changed, 245 insertions(+), 79 deletions(-)
 create mode 100644 test/unittest/codegen/tst.kernel_read_deref_indirect_scalar.d
 create mode 100644 test/unittest/codegen/tst.kernel_read_deref_indirect_str.d
 create mode 100644 test/unittest/codegen/tst.kernel_read_deref_struct.d
 create mode 100644 test/unittest/codegen/tst.kernel_read_index_indirect_str.d
 create mode 100644 test/unittest/codegen/tst.kernel_read_indirect_scalar.d
 create mode 100644 test/unittest/codegen/tst.kernel_read_mixed.d
 create mode 100644 test/unittest/codegen/tst.kernel_read_scalar.d
 create mode 100644 test/unittest/codegen/tst.kernel_read_str.d
 create mode 100644 test/unittest/codegen/tst.read_index_indirect_str.d

diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
index 36ee1e38..28f9171c 100644
--- a/libdtrace/dt_cg.c
+++ b/libdtrace/dt_cg.c
@@ -2123,6 +2123,23 @@ dt_cg_ldsize(dt_node_t *dnp, ctf_file_t *ctfp, ctf_id_t type, ssize_t *ret_size)
 	return ldstw[size];
 }
 
+static void
+dt_cg_load_scalar(dt_node_t *dnp, uint_t op, ssize_t size, dt_irlist_t *dlp,
+		  dt_regset_t *drp)
+{
+	if (dt_regset_xalloc_args(drp) == -1)
+		longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
+	emit(dlp, BPF_LOAD(BPF_DW, BPF_REG_1, BPF_REG_FP, DT_STK_SP));
+	emit(dlp, BPF_MOV_IMM(BPF_REG_2, size));
+	emit(dlp, BPF_MOV_REG(BPF_REG_3, dnp->dn_reg));
+	emit(dlp, BPF_MOV_REG(dnp->dn_reg, BPF_REG_1));
+	dt_regset_xalloc(drp, BPF_REG_0);
+	emit(dlp, BPF_CALL_HELPER(BPF_FUNC_probe_read));
+	dt_regset_free(drp, BPF_REG_0);
+	dt_regset_free_args(drp);
+	emit(dlp, BPF_LOAD(op, dnp->dn_reg, dnp->dn_reg, 0));
+}
+
 static void
 dt_cg_load_var(dt_node_t *dst, dt_irlist_t *dlp, dt_regset_t *drp)
 {
@@ -2387,7 +2404,6 @@ dt_cg_field_set(dt_node_t *src, dt_irlist_t *dlp,
 	 * r2 <<= shift
 	 * r1 |= r2
 	 */
-	/* FIXME: Does not handle userland */
 	emit(dlp, BPF_LOAD(dt_cg_ldsize(dst, fp, m.ctm_type, NULL), r1, dst->dn_reg, 0));
 	dt_cg_setx(dlp, r2, cmask);
 	emit(dlp, BPF_ALU64_REG(BPF_AND, r1, r2));
@@ -5027,20 +5043,9 @@ dt_cg_node(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
 		dnp->dn_reg = dnp->dn_child->dn_reg;
 
 		if (!(dnp->dn_flags & DT_NF_REF)) {
-			uint_t	ubit;
 			uint_t	op;
 			ssize_t	size;
 
-			/*
-			 * Save and restore DT_NF_USERLAND across
-			 * dt_cg_ldsize(): we need the sign bit from dnp and
-			 * the user bit from dnp->dn_child in order to get the
-			 * proper opcode.
-			 */
-			ubit = dnp->dn_flags & DT_NF_USERLAND;
-			dnp->dn_flags |=
-			    (dnp->dn_child->dn_flags & DT_NF_USERLAND);
-
 			dt_cg_check_notnull(dlp, drp, dnp->dn_reg);
 			op = dt_cg_ldsize(dnp, ctfp, dnp->dn_type, &size);
 
@@ -5056,11 +5061,10 @@ dt_cg_node(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
 						 dnp->dn_reg);
 			}
 
-			/* FIXME: Does not handled signed or userland */
-			emit(dlp, BPF_LOAD(op, dnp->dn_reg, dnp->dn_reg, 0));
-
-			dnp->dn_flags &= ~DT_NF_USERLAND;
-			dnp->dn_flags |= ubit;
+			if (dnp->dn_child->dn_flags & DT_NF_DPTR)
+				emit(dlp, BPF_LOAD(op, dnp->dn_reg, dnp->dn_reg, 0));
+			else
+				dt_cg_load_scalar(dnp, op, size, dlp, drp);
 		}
 		break;
 
@@ -5141,9 +5145,9 @@ dt_cg_node(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
 
 	case DT_TOK_PTR:
 	case DT_TOK_DOT: {
-
 		assert(dnp->dn_right->dn_kind == DT_NODE_IDENT);
 		dt_cg_node(dnp->dn_left, dlp, drp);
+
 		dt_cg_check_notnull(dlp, drp, dnp->dn_left->dn_reg);
 
 		/*
@@ -5203,24 +5207,15 @@ dt_cg_node(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
 		}
 
 		if (!(dnp->dn_flags & DT_NF_REF)) {
-			uint_t ubit;
-
-			/*
-			 * Save and restore DT_NF_USERLAND across
-			 * dt_cg_ldsize(): we need the sign bit from dnp and
-			 * the user bit from dnp->dn_left in order to get the
-			 * proper opcode.
-			 */
-			ubit = dnp->dn_flags & DT_NF_USERLAND;
-			dnp->dn_flags |=
-			    (dnp->dn_left->dn_flags & DT_NF_USERLAND);
+			uint_t	op;
+			ssize_t	size;
 
-			/* FIXME: Does not handle signed and userland */
-			emit(dlp, BPF_LOAD(dt_cg_ldsize(dnp, ctfp, m.ctm_type, NULL),
-					   dnp->dn_left->dn_reg, dnp->dn_left->dn_reg, 0));
+			op = dt_cg_ldsize(dnp, ctfp, m.ctm_type, &size);
 
-			dnp->dn_flags &= ~DT_NF_USERLAND;
-			dnp->dn_flags |= ubit;
+			if (dnp->dn_left->dn_flags & DT_NF_DPTR)
+				emit(dlp, BPF_LOAD(op, dnp->dn_left->dn_reg, dnp->dn_left->dn_reg, 0));
+			else
+				dt_cg_load_scalar(dnp->dn_left, op, size, dlp, drp);
 
 			if (dnp->dn_flags & DT_NF_BITFIELD)
 				dt_cg_field_get(dnp, dlp, drp, ctfp, &m);
@@ -5323,13 +5318,16 @@ dt_cg_node(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
 			if ((dnp->dn_reg = dt_regset_alloc(drp)) == -1)
 				longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
 
-			dt_cg_xsetx(dlp, dnp->dn_ident,
-			    DT_LBL_NONE, dnp->dn_reg, sym.st_value);
+			dt_cg_xsetx(dlp, dnp->dn_ident, DT_LBL_NONE,
+				    dnp->dn_reg, sym.st_value);
 
 			if (!(dnp->dn_flags & DT_NF_REF)) {
-				/* FIXME: NO signed or userland yet */
-				emit(dlp, BPF_LOAD(dt_cg_ldsize(dnp, ctfp, dnp->dn_type, NULL),
-						   dnp->dn_reg, dnp->dn_reg, 0));
+				uint_t	op;
+				ssize_t	size;
+
+				op = dt_cg_ldsize(dnp, ctfp, dnp->dn_type, &size);
+
+				dt_cg_load_scalar(dnp, op, size, dlp, drp);
 			}
 			break;
 		}
diff --git a/libdtrace/dt_parser.c b/libdtrace/dt_parser.c
index fd89b2c7..49d3ce77 100644
--- a/libdtrace/dt_parser.c
+++ b/libdtrace/dt_parser.c
@@ -2781,6 +2781,13 @@ dt_xcook_ident(dt_node_t *dnp, dt_idhash_t *dhp, uint_t idkind, int create)
 		dnp->dn_ident = idp;
 		dnp->dn_flags |= DT_NF_LVALUE;
 
+		/*
+		 * If the type of the variable is a REF-type, we mark this
+		 * variable node as a pointer to DTrace-managed storage (DPTR).
+		 */
+		if (dnp->dn_flags & DT_NF_REF)
+			dnp->dn_flags |= DT_NF_DPTR;
+
 		if (idp->di_flags & DT_IDFLG_WRITE)
 			dnp->dn_flags |= DT_NF_WRITABLE;
 
@@ -2907,6 +2914,13 @@ dt_xcook_ident(dt_node_t *dnp, dt_idhash_t *dhp, uint_t idkind, int create)
 		dnp->dn_ident = idp;
 		dnp->dn_flags |= DT_NF_LVALUE | DT_NF_WRITABLE;
 
+		/*
+		 * If the type of the variable is a REF-type, we mark this
+		 * variable node as a pointer to DTrace-managed storage (DPTR).
+		 */
+		if (dnp->dn_flags & DT_NF_REF)
+			dnp->dn_flags |= DT_NF_DPTR;
+
 		/*
 		 * Still a good idea, but not relevant for assignments: see
 		 * dt_cook_ident:DT_TOK_ASGN for more.  In particular, this is
@@ -3235,7 +3249,7 @@ dt_cook_op2(dt_node_t *dnp, uint_t idflags)
 	ctf_membinfo_t m;
 	ctf_file_t *ctfp;
 	ctf_id_t type;
-	int kind, val, uref;
+	int kind, val, xflags;
 	dt_ident_t *idp;
 
 	char n1[DT_TYPE_NAMELEN];
@@ -3465,20 +3479,20 @@ dt_cook_op2(dt_node_t *dnp, uint_t idflags)
 
 		if (lp_is_int && rp_is_int) {
 			dt_type_promote(lp, rp, &ctfp, &type);
-			uref = 0;
+			xflags = 0;
 		} else if (lp_is_ptr && rp_is_int) {
 			ctfp = lp->dn_ctfp;
 			type = lp->dn_type;
-			uref = lp->dn_flags & DT_NF_USERLAND;
+			xflags = lp->dn_flags & (DT_NF_USERLAND | DT_NF_DPTR);
 		} else if (lp_is_int && rp_is_ptr && op == DT_TOK_ADD) {
 			ctfp = rp->dn_ctfp;
 			type = rp->dn_type;
-			uref = rp->dn_flags & DT_NF_USERLAND;
+			xflags = rp->dn_flags & (DT_NF_USERLAND | DT_NF_DPTR);
 		} else if (lp_is_ptr && rp_is_ptr && op == DT_TOK_SUB &&
 		    dt_node_is_ptrcompat(lp, rp, NULL, NULL)) {
 			ctfp = dtp->dt_ddefs->dm_ctfp;
 			type = ctf_lookup_by_name(ctfp, "ptrdiff_t");
-			uref = 0;
+			xflags = 0;
 		} else
 			xyerror(D_OP_INCOMPAT, "operands have incompatible "
 			    "types: \"%s\" %s \"%s\"\n",
@@ -3503,7 +3517,6 @@ dt_cook_op2(dt_node_t *dnp, uint_t idflags)
 		/*
 		 * Array bounds-checking.  (Non-associative arrays only.)
 		 */
-
 		artype = ctf_type_resolve(lp->dn_ctfp, lp->dn_type);
 		arkind = ctf_type_kind(lp->dn_ctfp, artype);
 
@@ -3525,8 +3538,8 @@ dt_cook_op2(dt_node_t *dnp, uint_t idflags)
 		dt_node_attr_assign(dnp, dt_attr_min(lp->dn_attr, rp->dn_attr));
 		dt_node_prop_alloca(dnp, lp, rp);
 
-		if (uref)
-			dnp->dn_flags |= DT_NF_USERLAND;
+		if (xflags)
+			dnp->dn_flags |= xflags;
 		break;
 	}
 
@@ -3649,11 +3662,11 @@ dt_cook_op2(dt_node_t *dnp, uint_t idflags)
 		if ((idp = dt_node_resolve(rp, DT_IDENT_XLSOU)) != NULL) {
 			ctfp = idp->di_ctfp;
 			type = idp->di_type;
-			uref = idp->di_flags & DT_IDFLG_USER;
+			xflags = idp->di_flags & DT_IDFLG_USER;
 		} else {
 			ctfp = rp->dn_ctfp;
 			type = rp->dn_type;
-			uref = rp->dn_flags & DT_NF_USERLAND;
+			xflags = rp->dn_flags & DT_NF_USERLAND;
 		}
 
 		/*
@@ -3679,7 +3692,7 @@ dt_cook_op2(dt_node_t *dnp, uint_t idflags)
 			dt_ident_type_assign(lp->dn_ident, ctfp, type);
 			dt_ident_set_storage(lp->dn_ident, alignment, size);
 
-			if (uref) {
+			if (xflags) {
 				lp->dn_flags |= DT_NF_USERLAND;
 				lp->dn_ident->di_flags |= DT_IDFLG_USER;
 			}
@@ -3861,11 +3874,11 @@ asgn_common:
 
 			ctfp = idp->di_ctfp;
 			type = ctf_type_resolve(ctfp, idp->di_type);
-			uref = idp->di_flags & DT_IDFLG_USER;
+			xflags = idp->di_flags & DT_IDFLG_USER;
 		} else {
 			ctfp = lp->dn_ctfp;
 			type = ctf_type_resolve(ctfp, lp->dn_type);
-			uref = lp->dn_flags & DT_NF_USERLAND;
+			xflags = lp->dn_flags & DT_NF_USERLAND;
 		}
 
 		kind = ctf_type_kind(ctfp, type);
@@ -3936,7 +3949,7 @@ asgn_common:
 		if (lp->dn_flags & DT_NF_WRITABLE)
 			dnp->dn_flags |= DT_NF_WRITABLE;
 
-		if (uref && (kind == CTF_K_POINTER ||
+		if (xflags && (kind == CTF_K_POINTER ||
 		    (dnp->dn_flags & DT_NF_REF)))
 			dnp->dn_flags |= DT_NF_USERLAND;
 		break;
@@ -4855,6 +4868,8 @@ dt_node_printr(dt_node_t *dnp, FILE *fp, int depth)
 			strcat(n, ",ALLOCA");
 		if (dnp->dn_flags & DT_NF_NONASSIGN)
 			strcat(n, ",NONASSIGN");
+		if (dnp->dn_flags & DT_NF_DPTR)
+			strcat(n, ",DPTR");
 		strcat(buf, n + 1);
 	} else
 		strcat(buf, "0");
diff --git a/libdtrace/dt_parser.h b/libdtrace/dt_parser.h
index 941ca47b..a8aecb9a 100644
--- a/libdtrace/dt_parser.h
+++ b/libdtrace/dt_parser.h
@@ -160,6 +160,7 @@ typedef struct dt_node {
 #define	DT_NF_USERLAND	0x40	/* data is a userland address */
 #define	DT_NF_ALLOCA	0x80	/* pointer derived from alloca() */
 #define	DT_NF_NONASSIGN	0x100	/* node is not assignable */
+#define	DT_NF_DPTR	0x200	/* node is a ptr to DTrace-managed storage */
 
 #define	DT_TYPE_NAMELEN	128	/* reasonable size for ctf_type_name() */
 
diff --git a/test/unittest/arrays/tst.ctf-bounds.d b/test/unittest/arrays/tst.ctf-bounds.d
index e60bd5aa..aff9b7f1 100644
--- a/test/unittest/arrays/tst.ctf-bounds.d
+++ b/test/unittest/arrays/tst.ctf-bounds.d
@@ -4,7 +4,6 @@
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
-/* @@xfail: dtv2 */
 
 /*
  * ASSERTION:
diff --git a/test/unittest/arrays/tst.ctf-bounds.oob-cast.d b/test/unittest/arrays/tst.ctf-bounds.oob-cast.d
index 2ee701e5..988f3472 100644
--- a/test/unittest/arrays/tst.ctf-bounds.oob-cast.d
+++ b/test/unittest/arrays/tst.ctf-bounds.oob-cast.d
@@ -4,7 +4,6 @@
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
-/* @@xfail: dtv2 */
 
 /*
  * ASSERTION:
diff --git a/test/unittest/arrays/tst.declared-bounds.oob-cast.d b/test/unittest/arrays/tst.declared-bounds.oob-cast.d
index fe63ee8e..296b4ccf 100644
--- a/test/unittest/arrays/tst.declared-bounds.oob-cast.d
+++ b/test/unittest/arrays/tst.declared-bounds.oob-cast.d
@@ -4,7 +4,6 @@
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
-/* @@xfail: dtv2 */
 
 /*
  * ASSERTION:
diff --git a/test/unittest/builtinvar/tst.hpriority.d b/test/unittest/builtinvar/tst.hpriority.d
index f5adf3f5..a77c87f1 100644
--- a/test/unittest/builtinvar/tst.hpriority.d
+++ b/test/unittest/builtinvar/tst.hpriority.d
@@ -4,7 +4,6 @@
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
-/* @@xfail: dtv2 - uses reading from kernel addresses */
 
 /*
  * ASSERTION:
diff --git a/test/unittest/builtinvar/tst.lwpsinfo.d b/test/unittest/builtinvar/tst.lwpsinfo.d
index 272ecdfe..1e476bde 100644
--- a/test/unittest/builtinvar/tst.lwpsinfo.d
+++ b/test/unittest/builtinvar/tst.lwpsinfo.d
@@ -4,7 +4,6 @@
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
-/* @@xfail: dtv2 */
 
 /*
  * ASSERTION:
diff --git a/test/unittest/builtinvar/tst.lwpsinfo1.d b/test/unittest/builtinvar/tst.lwpsinfo1.d
index 6011670d..a445f190 100644
--- a/test/unittest/builtinvar/tst.lwpsinfo1.d
+++ b/test/unittest/builtinvar/tst.lwpsinfo1.d
@@ -4,7 +4,6 @@
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
-/* @@xfail: dtv2 - uses reading from kernel addresses */
 
 /*
  * ASSERTION:
diff --git a/test/unittest/codegen/tst.kernel_read_deref_indirect_scalar.d b/test/unittest/codegen/tst.kernel_read_deref_indirect_scalar.d
new file mode 100644
index 00000000..9d8bdc69
--- /dev/null
+++ b/test/unittest/codegen/tst.kernel_read_deref_indirect_scalar.d
@@ -0,0 +1,20 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2022, 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.
+ */
+
+#pragma D option quiet
+
+BEGIN
+{
+	ptr = &`max_pfn;
+	trace(*ptr);
+	exit(0);
+}
+
+ERROR
+{
+	exit(1);
+}
diff --git a/test/unittest/codegen/tst.kernel_read_deref_indirect_str.d b/test/unittest/codegen/tst.kernel_read_deref_indirect_str.d
new file mode 100644
index 00000000..81a1671c
--- /dev/null
+++ b/test/unittest/codegen/tst.kernel_read_deref_indirect_str.d
@@ -0,0 +1,18 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2022, 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.
+ */
+
+#pragma D option quiet
+
+BEGIN
+{
+	exit(*`linux_banner == 76 ? 0 : 1);
+}
+
+ERROR
+{
+	exit(1);
+}
diff --git a/test/unittest/codegen/tst.kernel_read_deref_struct.d b/test/unittest/codegen/tst.kernel_read_deref_struct.d
new file mode 100644
index 00000000..5baf604c
--- /dev/null
+++ b/test/unittest/codegen/tst.kernel_read_deref_struct.d
@@ -0,0 +1,19 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2022, 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.
+ */
+
+#pragma D option quiet
+
+BEGIN
+{
+	trace(*`cad_pid);
+	exit(0);
+}
+
+ERROR
+{
+	exit(1);
+}
diff --git a/test/unittest/codegen/tst.kernel_read_index_indirect_str.d b/test/unittest/codegen/tst.kernel_read_index_indirect_str.d
new file mode 100644
index 00000000..7aa89a40
--- /dev/null
+++ b/test/unittest/codegen/tst.kernel_read_index_indirect_str.d
@@ -0,0 +1,21 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2022, 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.
+ */
+
+#pragma D option quiet
+
+char	*s;
+
+BEGIN
+{
+	s = `linux_banner;
+	exit(s[0] == 76 ? 0 : 1);
+}
+
+ERROR
+{
+	exit(1);
+}
diff --git a/test/unittest/codegen/tst.kernel_read_indirect_scalar.d b/test/unittest/codegen/tst.kernel_read_indirect_scalar.d
new file mode 100644
index 00000000..3683d4aa
--- /dev/null
+++ b/test/unittest/codegen/tst.kernel_read_indirect_scalar.d
@@ -0,0 +1,19 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2022, 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.
+ */
+
+#pragma D option quiet
+
+BEGIN
+{
+	trace(`cad_pid->level);
+	exit(0);
+}
+
+ERROR
+{
+	exit(1);
+}
diff --git a/test/unittest/codegen/tst.kernel_read_mixed.d b/test/unittest/codegen/tst.kernel_read_mixed.d
new file mode 100644
index 00000000..d1cf9ec6
--- /dev/null
+++ b/test/unittest/codegen/tst.kernel_read_mixed.d
@@ -0,0 +1,18 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2022, 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.
+ */
+
+#pragma D option quiet
+
+BEGIN
+{
+	exit(curthread->thread_pid->numbers[0].nr == pid ? 0 : 1);
+}
+
+ERROR
+{
+	exit(1);
+}
diff --git a/test/unittest/codegen/tst.kernel_read_scalar.d b/test/unittest/codegen/tst.kernel_read_scalar.d
new file mode 100644
index 00000000..bbc2d06f
--- /dev/null
+++ b/test/unittest/codegen/tst.kernel_read_scalar.d
@@ -0,0 +1,19 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2022, 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.
+ */
+
+#pragma D option quiet
+
+BEGIN
+{
+	trace(`max_pfn);
+	exit(0);
+}
+
+ERROR
+{
+	exit(1);
+}
diff --git a/test/unittest/codegen/tst.kernel_read_str.d b/test/unittest/codegen/tst.kernel_read_str.d
new file mode 100644
index 00000000..4ff61b8c
--- /dev/null
+++ b/test/unittest/codegen/tst.kernel_read_str.d
@@ -0,0 +1,19 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2022, 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.
+ */
+
+#pragma D option quiet
+
+BEGIN
+{
+	trace((string)`linux_banner);
+	exit(0);
+}
+
+ERROR
+{
+	exit(1);
+}
diff --git a/test/unittest/codegen/tst.read_index_indirect_str.d b/test/unittest/codegen/tst.read_index_indirect_str.d
new file mode 100644
index 00000000..a1a1a293
--- /dev/null
+++ b/test/unittest/codegen/tst.read_index_indirect_str.d
@@ -0,0 +1,21 @@
+/*
+ * Oracle Linux DTrace.
+ * Copyright (c) 2022, 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.
+ */
+
+#pragma D option quiet
+
+char	*s;
+
+BEGIN
+{
+	s = probeprov;
+	exit(s[0] == 100 ? 0 : 1);
+}
+
+ERROR
+{
+	exit(1);
+}
diff --git a/test/unittest/funcs/tst.bcopy.d b/test/unittest/funcs/tst.bcopy.d
index 797e891e..6806efec 100644
--- a/test/unittest/funcs/tst.bcopy.d
+++ b/test/unittest/funcs/tst.bcopy.d
@@ -22,8 +22,7 @@ BEGIN
 	ptr = alloca(sizeof(unsigned long));
 	bcopy((void *)&`max_pfn, ptr, sizeof(unsigned long));
 	ulongp = (unsigned long *)ptr;
-        /* DTv2: doing this needs deref-implies-copyin, which isn't there yet. */
-/*	ret = (`max_pfn == *ulongp) ? 0 : 1; */
+	ret = (`max_pfn == *ulongp) ? 0 : 1;
 	ret = *ulongp; ret = 0;
 	ulong_deref = *ulongp;
 }
@@ -37,9 +36,8 @@ tick-1
 tick-1
 /ret == 1/
 {
-	/* DTdv2: this error message has the same problem.  */
-/*	printf("memory address contained 0x%x, expected 0x%x\n",
-		ulong_deref, `max_pfn); */
+	printf("memory address contained 0x%x, expected 0x%x\n",
+		ulong_deref, `max_pfn);
 	printf("memory address contained wrong contents\n");
 	exit(1);
 }
diff --git a/test/unittest/inline/tst.InlineTypedef.d b/test/unittest/inline/tst.InlineTypedef.d
index d69185ca..21a7a3df 100644
--- a/test/unittest/inline/tst.InlineTypedef.d
+++ b/test/unittest/inline/tst.InlineTypedef.d
@@ -4,7 +4,6 @@
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
-/* @@xfail: dtv2 - uses reading from kernel addresses */
 
 /*
  * ASSERTION:
diff --git a/test/unittest/lexer/tst.keyword-member.d b/test/unittest/lexer/tst.keyword-member.d
index 6d7ea159..42c0db78 100644
--- a/test/unittest/lexer/tst.keyword-member.d
+++ b/test/unittest/lexer/tst.keyword-member.d
@@ -4,7 +4,6 @@
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
-/* @@xfail: dtv2 - uses reading from kernel addresses */
 
 /*
  * ASSERTION:
diff --git a/test/unittest/pointers/tst.ArrayPointer2.d b/test/unittest/pointers/tst.ArrayPointer2.d
index 61168647..ed4b77bb 100644
--- a/test/unittest/pointers/tst.ArrayPointer2.d
+++ b/test/unittest/pointers/tst.ArrayPointer2.d
@@ -4,7 +4,6 @@
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
-/* @@xfail: dtv2 */
 
 /*
  * ASSERTION: D permits the use of array [] index notation with both pointer
diff --git a/test/unittest/pointers/tst.ArrayPointer3.d b/test/unittest/pointers/tst.ArrayPointer3.d
index fd1dad3d..2421bcd7 100644
--- a/test/unittest/pointers/tst.ArrayPointer3.d
+++ b/test/unittest/pointers/tst.ArrayPointer3.d
@@ -4,7 +4,6 @@
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
-/* @@xfail: dtv2 */
 
 /*
  * ASSERTION: In D, the an array variable can be assigned to a pointer.
diff --git a/test/unittest/pointers/tst.GlobalVar.d b/test/unittest/pointers/tst.GlobalVar.d
index 3ec73bd3..9127eb69 100644
--- a/test/unittest/pointers/tst.GlobalVar.d
+++ b/test/unittest/pointers/tst.GlobalVar.d
@@ -4,7 +4,6 @@
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
-/* @@xfail: dtv2 */
 
 /*
  * ASSERTION: Pointer declarations are global.
diff --git a/test/unittest/pointers/tst.IntegerArithmetic1.d b/test/unittest/pointers/tst.IntegerArithmetic1.d
index 7bf97574..b109e5bb 100644
--- a/test/unittest/pointers/tst.IntegerArithmetic1.d
+++ b/test/unittest/pointers/tst.IntegerArithmetic1.d
@@ -4,7 +4,6 @@
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
-/* @@xfail: dtv2 */
 
 /*
  * ASSERTION:
diff --git a/test/unittest/pointers/tst.PointerArithmetic2.d b/test/unittest/pointers/tst.PointerArithmetic2.d
index 1e9ed77e..9574cacc 100644
--- a/test/unittest/pointers/tst.PointerArithmetic2.d
+++ b/test/unittest/pointers/tst.PointerArithmetic2.d
@@ -4,7 +4,6 @@
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
-/* @@xfail: dtv2 */
 
 /*
  * ASSERTION:
diff --git a/test/unittest/pointers/tst.VoidCast.d b/test/unittest/pointers/tst.VoidCast.d
index 8c831e6a..9b8e1395 100644
--- a/test/unittest/pointers/tst.VoidCast.d
+++ b/test/unittest/pointers/tst.VoidCast.d
@@ -4,7 +4,6 @@
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
-/* @@xfail: dtv2 */
 
 /*
  * ASSERTION:
diff --git a/test/unittest/pointers/tst.basic1.d b/test/unittest/pointers/tst.basic1.d
index e0b9e3cd..d0d50a24 100644
--- a/test/unittest/pointers/tst.basic1.d
+++ b/test/unittest/pointers/tst.basic1.d
@@ -4,7 +4,6 @@
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
-/* @@xfail: dtv2 */
 
 /*
  * ASSERTION: Pointers can be stored in variables.
diff --git a/test/unittest/printf/tst.str.d b/test/unittest/printf/tst.str.d
index ce5af45e..2ea55277 100644
--- a/test/unittest/printf/tst.str.d
+++ b/test/unittest/printf/tst.str.d
@@ -1,10 +1,9 @@
 /*
  * Oracle Linux DTrace.
- * Copyright (c) 2006, 2020, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, 2022, 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 - uses reading from kernel addresses */
 
 /*
  * ASSERTION:
diff --git a/test/unittest/sched/tst.var-curcpu.d b/test/unittest/sched/tst.var-curcpu.d
index 2f047342..113401ae 100644
--- a/test/unittest/sched/tst.var-curcpu.d
+++ b/test/unittest/sched/tst.var-curcpu.d
@@ -5,7 +5,6 @@
  * http://oss.oracle.com/licenses/upl.
  */
 
-/* @@xfail: dtv2 */
 /* @@trigger: none */
 
 cpuinfo_t	*cpuinfo;
diff --git a/test/unittest/trace/tst.misc.d b/test/unittest/trace/tst.misc.d
index cbb8a003..96d9c3d7 100644
--- a/test/unittest/trace/tst.misc.d
+++ b/test/unittest/trace/tst.misc.d
@@ -4,7 +4,6 @@
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
-/* @@xfail: dtv2 */
 
 /*
  * ASSERTION:
diff --git a/test/unittest/translators/tst.TestTransStability.d b/test/unittest/translators/tst.TestTransStability.d
index 477733e5..fcdbbee1 100644
--- a/test/unittest/translators/tst.TestTransStability.d
+++ b/test/unittest/translators/tst.TestTransStability.d
@@ -5,7 +5,6 @@
  * http://oss.oracle.com/licenses/upl.
  */
 
-/* @@xfail: dtv2 */
 /* @@runtest-opts: -v */
 
 /*
diff --git a/test/unittest/vars/tst.gid.d b/test/unittest/vars/tst.gid.d
index e4b6872e..6260bbdb 100644
--- a/test/unittest/vars/tst.gid.d
+++ b/test/unittest/vars/tst.gid.d
@@ -4,7 +4,6 @@
  * Licensed under the Universal Permissive License v 1.0 as shown at
  * http://oss.oracle.com/licenses/upl.
  */
-/* @@xfail: dtv2 */
 
 #pragma D option quiet
 
-- 
2.34.1




More information about the DTrace-devel mailing list