1451 DTrace needs toupper()/tolower() subroutines
authorBryan Cantrill <bryan@joyent.com>
Tue, 12 Jul 2011 21:51:55 -0700
changeset 13458 5e394d8db762
parent 13457 571b0355c2e3
child 13459 c3454574dd1a
1451 DTrace needs toupper()/tolower() subroutines Reviewed by: Gordon Ross <[email protected]> Reviewed by: Eric Schrock <[email protected]> Approved by: Garrett D'Amore <[email protected]>
usr/src/cmd/dtrace/test/tst/common/aggs/tst.subr.d
usr/src/cmd/dtrace/test/tst/common/funcs/err.D_PROTO_ARG.tolower.d
usr/src/cmd/dtrace/test/tst/common/funcs/err.D_PROTO_ARG.toupper.d
usr/src/cmd/dtrace/test/tst/common/funcs/err.D_PROTO_LEN.tolower.d
usr/src/cmd/dtrace/test/tst/common/funcs/err.D_PROTO_LEN.tolowertoomany.d
usr/src/cmd/dtrace/test/tst/common/funcs/err.D_PROTO_LEN.toupper.d
usr/src/cmd/dtrace/test/tst/common/funcs/err.D_PROTO_LEN.touppertoomany.d
usr/src/cmd/dtrace/test/tst/common/funcs/tst.tolower.d
usr/src/cmd/dtrace/test/tst/common/funcs/tst.toupper.d
usr/src/lib/libdtrace/common/dt_open.c
usr/src/pkg/manifests/system-dtrace-tests.mf
usr/src/uts/common/dtrace/dtrace.c
usr/src/uts/common/sys/dtrace.h
--- a/usr/src/cmd/dtrace/test/tst/common/aggs/tst.subr.d	Mon Jul 11 23:01:51 2011 -0700
+++ b/usr/src/cmd/dtrace/test/tst/common/aggs/tst.subr.d	Tue Jul 12 21:51:55 2011 -0700
@@ -24,8 +24,6 @@
  * Use is subject to license terms.
  */
 
-#pragma ident	"%Z%%M%	%I%	%E% SMI"
-
 #include <sys/dtrace.h>
 
 #define INTFUNC(x)			\
@@ -98,6 +96,8 @@
 STRFUNC(inet_ntoa((ipaddr_t *)alloca(sizeof (ipaddr_t))))
 STRFUNC(inet_ntoa6((in6_addr_t *)alloca(sizeof (in6_addr_t))))
 STRFUNC(inet_ntop(AF_INET, (void *)alloca(sizeof (ipaddr_t))))
+STRFUNC(toupper("foo"))
+STRFUNC(tolower("BAR"))
 
 BEGIN
 /subr == DIF_SUBR_MAX + 1/
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/dtrace/test/tst/common/funcs/err.D_PROTO_ARG.tolower.d	Tue Jul 12 21:51:55 2011 -0700
@@ -0,0 +1,30 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright (c) 2011, Joyent, Inc. All rights reserved.
+ */
+
+BEGIN
+{
+	trace(tolower(2152006));
+	exit(1);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/dtrace/test/tst/common/funcs/err.D_PROTO_ARG.toupper.d	Tue Jul 12 21:51:55 2011 -0700
@@ -0,0 +1,30 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright (c) 2011, Joyent, Inc. All rights reserved.
+ */
+
+BEGIN
+{
+	trace(toupper(timestamp));
+	exit(1);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/dtrace/test/tst/common/funcs/err.D_PROTO_LEN.tolower.d	Tue Jul 12 21:51:55 2011 -0700
@@ -0,0 +1,30 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright (c) 2011, Joyent, Inc. All rights reserved.
+ */
+
+BEGIN
+{
+	trace(tolower());
+	exit(1);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/dtrace/test/tst/common/funcs/err.D_PROTO_LEN.tolowertoomany.d	Tue Jul 12 21:51:55 2011 -0700
@@ -0,0 +1,30 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright (c) 2011, Joyent, Inc. All rights reserved.
+ */
+
+BEGIN
+{
+	trace(tolower("dory", "eel", "roughy"));
+	exit(1);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/dtrace/test/tst/common/funcs/err.D_PROTO_LEN.toupper.d	Tue Jul 12 21:51:55 2011 -0700
@@ -0,0 +1,30 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright (c) 2011, Joyent, Inc. All rights reserved.
+ */
+
+BEGIN
+{
+	trace(toupper());
+	exit(1);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/dtrace/test/tst/common/funcs/err.D_PROTO_LEN.touppertoomany.d	Tue Jul 12 21:51:55 2011 -0700
@@ -0,0 +1,30 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright (c) 2011, Joyent, Inc. All rights reserved.
+ */
+
+BEGIN
+{
+	trace(tolower("haino", "tylo"));
+	exit(1);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/dtrace/test/tst/common/funcs/tst.tolower.d	Tue Jul 12 21:51:55 2011 -0700
@@ -0,0 +1,66 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright (c) 2011, Joyent, Inc. All rights reserved.
+ */
+
+#pragma D option quiet
+
+BEGIN
+{
+	i = 0;
+
+	input[i] = "ahi";
+	expected[i++] = "ahi";
+
+	input[i] = "MaHi!";
+	expected[i++] = "mahi!";
+
+	input[i] = "   Nase-5";
+	expected[i++] = "   nase-5";
+
+	input[i] = "!@#$%";
+	expected[i++] = "!@#$%";
+
+	i = 0;
+}
+
+tick-1ms
+/input[i] != NULL && (this->out = tolower(input[i])) != expected[i]/
+{
+	printf("expected tolower(\"%s\") to be \"%s\"; found \"%s\"\n",
+	    input[i], expected[i], this->out);
+	exit(1);
+}
+
+tick-1ms
+/input[i] != NULL/
+{
+	printf("tolower(\"%s\") is \"%s\", as expected\n",
+	    input[i], expected[i]);
+}
+
+tick-1ms
+/input[i++] == NULL/
+{
+	exit(0);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/usr/src/cmd/dtrace/test/tst/common/funcs/tst.toupper.d	Tue Jul 12 21:51:55 2011 -0700
@@ -0,0 +1,66 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright (c) 2011, Joyent, Inc. All rights reserved.
+ */
+
+#pragma D option quiet
+
+BEGIN
+{
+	i = 0;
+
+	input[i] = "ahi";
+	expected[i++] = "AHI";
+
+	input[i] = "MaHi!";
+	expected[i++] = "MAHI!";
+
+	input[i] = "   dace-9";
+	expected[i++] = "   DACE-9";
+
+	input[i] = "!@#$%";
+	expected[i++] = "!@#$%";
+
+	i = 0;
+}
+
+tick-1ms
+/input[i] != NULL && (this->out = toupper(input[i])) != expected[i]/
+{
+	printf("expected toupper(\"%s\") to be \"%s\"; found \"%s\"\n",
+	    input[i], expected[i], this->out);
+	exit(1);
+}
+
+tick-1ms
+/input[i] != NULL/
+{
+	printf("toupper(\"%s\") is \"%s\", as expected\n",
+	    input[i], expected[i]);
+}
+
+tick-1ms
+/input[i++] == NULL/
+{
+	exit(0);
+}
--- a/usr/src/lib/libdtrace/common/dt_open.c	Mon Jul 11 23:01:51 2011 -0700
+++ b/usr/src/lib/libdtrace/common/dt_open.c	Tue Jul 12 21:51:55 2011 -0700
@@ -106,8 +106,9 @@
 #define	DT_VERS_1_6_3	DT_VERSION_NUMBER(1, 6, 3)
 #define	DT_VERS_1_7	DT_VERSION_NUMBER(1, 7, 0)
 #define	DT_VERS_1_7_1	DT_VERSION_NUMBER(1, 7, 1)
-#define	DT_VERS_LATEST	DT_VERS_1_7_1
-#define	DT_VERS_STRING	"Sun D 1.7.1"
+#define	DT_VERS_1_8	DT_VERSION_NUMBER(1, 8, 0)
+#define	DT_VERS_LATEST	DT_VERS_1_8
+#define	DT_VERS_STRING	"Sun D 1.8"
 
 const dt_version_t _dtrace_versions[] = {
 	DT_VERS_1_0,	/* D API 1.0.0 (PSARC 2001/466) Solaris 10 FCS */
@@ -125,6 +126,7 @@
 	DT_VERS_1_6_3,	/* D API 1.6.3 */
 	DT_VERS_1_7,	/* D API 1.7 */
 	DT_VERS_1_7_1,	/* D API 1.7.1 */
+	DT_VERS_1_8,	/* D API 1.8 */
 	0
 };
 
@@ -379,6 +381,10 @@
 { "timestamp", DT_IDENT_SCALAR, 0, DIF_VAR_TIMESTAMP,
 	DT_ATTR_STABCMN, DT_VERS_1_0,
 	&dt_idops_type, "uint64_t" },
+{ "tolower", DT_IDENT_FUNC, 0, DIF_SUBR_TOLOWER, DT_ATTR_STABCMN, DT_VERS_1_8,
+	&dt_idops_func, "string(const char *)" },
+{ "toupper", DT_IDENT_FUNC, 0, DIF_SUBR_TOUPPER, DT_ATTR_STABCMN, DT_VERS_1_8,
+	&dt_idops_func, "string(const char *)" },
 { "trace", DT_IDENT_ACTFUNC, 0, DT_ACT_TRACE, DT_ATTR_STABCMN, DT_VERS_1_0,
 	&dt_idops_func, "void(@)" },
 { "tracemem", DT_IDENT_ACTFUNC, 0, DT_ACT_TRACEMEM,
--- a/usr/src/pkg/manifests/system-dtrace-tests.mf	Mon Jul 11 23:01:51 2011 -0700
+++ b/usr/src/pkg/manifests/system-dtrace-tests.mf	Tue Jul 12 21:51:55 2011 -0700
@@ -748,6 +748,8 @@
 file path=opt/SUNWdtrt/tst/common/funcs/err.D_PROTO_ARG.mobadarg.d mode=0444
 file path=opt/SUNWdtrt/tst/common/funcs/err.D_PROTO_ARG.raisebadarg.d \
     mode=0444
+file path=opt/SUNWdtrt/tst/common/funcs/err.D_PROTO_ARG.tolower.d mode=0444
+file path=opt/SUNWdtrt/tst/common/funcs/err.D_PROTO_ARG.toupper.d mode=0444
 file path=opt/SUNWdtrt/tst/common/funcs/err.D_PROTO_LEN.allocanoarg.d \
     mode=0444
 file path=opt/SUNWdtrt/tst/common/funcs/err.D_PROTO_LEN.badbreakpoint.d \
@@ -774,6 +776,12 @@
 file path=opt/SUNWdtrt/tst/common/funcs/err.D_PROTO_LEN.progenyofbad2.d \
     mode=0444
 file path=opt/SUNWdtrt/tst/common/funcs/err.D_PROTO_LEN.stopbadarg.d mode=0444
+file path=opt/SUNWdtrt/tst/common/funcs/err.D_PROTO_LEN.tolower.d mode=0444
+file path=opt/SUNWdtrt/tst/common/funcs/err.D_PROTO_LEN.tolowertoomany.d \
+    mode=0444
+file path=opt/SUNWdtrt/tst/common/funcs/err.D_PROTO_LEN.toupper.d mode=0444
+file path=opt/SUNWdtrt/tst/common/funcs/err.D_PROTO_LEN.touppertoomany.d \
+    mode=0444
 file path=opt/SUNWdtrt/tst/common/funcs/err.D_STRINGOF_TYPE.badstringof.d \
     mode=0444
 file path=opt/SUNWdtrt/tst/common/funcs/err.D_VAR_UNDEF.badvar.d mode=0444
@@ -840,6 +848,8 @@
 file path=opt/SUNWdtrt/tst/common/funcs/tst.substrminate.d.out mode=0444
 file path=opt/SUNWdtrt/tst/common/funcs/tst.system.d mode=0444
 file path=opt/SUNWdtrt/tst/common/funcs/tst.system.d.out mode=0444
+file path=opt/SUNWdtrt/tst/common/funcs/tst.tolower.d mode=0444
+file path=opt/SUNWdtrt/tst/common/funcs/tst.toupper.d mode=0444
 file path=opt/SUNWdtrt/tst/common/grammar/err.D_ADDROF_LVAL.d mode=0444
 file path=opt/SUNWdtrt/tst/common/grammar/err.D_EMPTY.empty.d mode=0444
 file path=opt/SUNWdtrt/tst/common/grammar/tst.clauses.d mode=0444
--- a/usr/src/uts/common/dtrace/dtrace.c	Mon Jul 11 23:01:51 2011 -0700
+++ b/usr/src/uts/common/dtrace/dtrace.c	Tue Jul 12 21:51:55 2011 -0700
@@ -3904,7 +3904,54 @@
 		break;
 	}
 
-	case DIF_SUBR_GETMAJOR:
+	case DIF_SUBR_TOUPPER:
+	case DIF_SUBR_TOLOWER: {
+		uintptr_t s = tupregs[0].dttk_value;
+		uint64_t size = state->dts_options[DTRACEOPT_STRSIZE];
+		char *dest = (char *)mstate->dtms_scratch_ptr, c;
+		size_t len = dtrace_strlen((char *)s, size);
+		char lower, upper, convert;
+		int64_t i;
+
+		if (subr == DIF_SUBR_TOUPPER) {
+			lower = 'a';
+			upper = 'z';
+			convert = 'A';
+		} else {
+			lower = 'A';
+			upper = 'Z';
+			convert = 'a';
+		}
+
+		if (!dtrace_canload(s, len + 1, mstate, vstate)) {
+			regs[rd] = NULL;
+			break;
+		}
+
+		if (!DTRACE_INSCRATCH(mstate, size)) {
+			DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
+			regs[rd] = NULL;
+			break;
+		}
+
+		for (i = 0; i < size - 1; i++) {
+			if ((c = dtrace_load8(s + i)) == '\0')
+				break;
+
+			if (c >= lower && c <= upper)
+				c = convert + (c - lower);
+
+			dest[i] = c;
+		}
+
+		ASSERT(i < size);
+		dest[i] = '\0';
+		regs[rd] = (uintptr_t)dest;
+		mstate->dtms_scratch_ptr += size;
+		break;
+	}
+
+case DIF_SUBR_GETMAJOR:
 #ifdef _LP64
 		regs[rd] = (tupregs[0].dttk_value >> NBITSMINOR64) & MAXMAJ64;
 #else
--- a/usr/src/uts/common/sys/dtrace.h	Mon Jul 11 23:01:51 2011 -0700
+++ b/usr/src/uts/common/sys/dtrace.h	Tue Jul 12 21:51:55 2011 -0700
@@ -285,8 +285,10 @@
 #define	DIF_SUBR_INET_NTOP		41
 #define	DIF_SUBR_INET_NTOA		42
 #define	DIF_SUBR_INET_NTOA6		43
+#define	DIF_SUBR_TOUPPER		44
+#define	DIF_SUBR_TOLOWER		45
 
-#define	DIF_SUBR_MAX			43	/* max subroutine value */
+#define	DIF_SUBR_MAX			45	/* max subroutine value */
 
 typedef uint32_t dif_instr_t;