Dtrace: add toupper()/tolower() and enhancements to lltostr().

Merge changes from illumos:

1451 DTrace needs toupper()/tolower() subroutines
1457 lltostr() D subroutine should take an optional base

This change bumps the DT_VERS_* number to 1.8.1 in
accordance to what is done in illumos.

The test suite we currently include is outdated and
doesnt support some updates in tst.subr.d which had to
be left out for now.

Illumos Revisions:	r13458 5e394d8db762
			r13459 c3454574dd1a

Reference:
https://www.illumos.org/issues/1451
https://www.illumos.org/issues/1457

Tested by:	Fabian Keil
Obtained from:	Illumos
MFC after:	1 month
This commit is contained in:
Pedro F. Giffuni 2013-03-25 15:40:57 +00:00
commit 730cecb05a
13 changed files with 788 additions and 15 deletions

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -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);
}

View file

@ -0,0 +1,80 @@
/*
* 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
int64_t val[int];
BEGIN
{
base = -2;
i = 0;
val[i++] = -10;
val[i++] = -1;
val[i++] = 0;
val[i++] = 10;
val[i++] = 100;
val[i++] = 1000;
val[i++] = (1LL << 62);
maxval = i;
i = 0;
}
tick-1ms
/i < maxval/
{
printf("base %2d of %20d: ", base, val[i]);
}
tick-1ms
/i < maxval/
{
printf(" %s\n", lltostr(val[i], base));
}
ERROR
{
printf(" <error>\n");
}
tick-1ms
/i < maxval/
{
i++;
}
tick-1ms
/i == maxval/
{
i = 0;
base++;
}
tick-1ms
/base > 40/
{
exit(0);
}

View file

@ -0,0 +1,302 @@
base -2 of -10: <error>
base -2 of -1: <error>
base -2 of 0: <error>
base -2 of 10: <error>
base -2 of 100: <error>
base -2 of 1000: <error>
base -2 of 4611686018427387904: <error>
base -1 of -10: <error>
base -1 of -1: <error>
base -1 of 0: <error>
base -1 of 10: <error>
base -1 of 100: <error>
base -1 of 1000: <error>
base -1 of 4611686018427387904: <error>
base 0 of -10: <error>
base 0 of -1: <error>
base 0 of 0: <error>
base 0 of 10: <error>
base 0 of 100: <error>
base 0 of 1000: <error>
base 0 of 4611686018427387904: <error>
base 1 of -10: <error>
base 1 of -1: <error>
base 1 of 0: <error>
base 1 of 10: <error>
base 1 of 100: <error>
base 1 of 1000: <error>
base 1 of 4611686018427387904: <error>
base 2 of -10: 1111111111111111111111111111111111111111111111111111111111110110
base 2 of -1: 1111111111111111111111111111111111111111111111111111111111111111
base 2 of 0: 0
base 2 of 10: 1010
base 2 of 100: 1100100
base 2 of 1000: 1111101000
base 2 of 4611686018427387904: 100000000000000000000000000000000000000000000000000000000000000
base 3 of -10: 11112220022122120101211020120210210211120
base 3 of -1: 11112220022122120101211020120210210211220
base 3 of 0: 0
base 3 of 10: 101
base 3 of 100: 10201
base 3 of 1000: 1101001
base 3 of 4611686018427387904: 1010201120122220002201001122110012110111
base 4 of -10: 33333333333333333333333333333312
base 4 of -1: 33333333333333333333333333333333
base 4 of 0: 0
base 4 of 10: 22
base 4 of 100: 1210
base 4 of 1000: 33220
base 4 of 4611686018427387904: 10000000000000000000000000000000
base 5 of -10: 2214220303114400424121122411
base 5 of -1: 2214220303114400424121122430
base 5 of 0: 0
base 5 of 10: 20
base 5 of 100: 400
base 5 of 1000: 13000
base 5 of 4611686018427387904: 302141200402211214402403104
base 6 of -10: 3520522010102100444244410
base 6 of -1: 3520522010102100444244423
base 6 of 0: 0
base 6 of 10: 14
base 6 of 100: 244
base 6 of 1000: 4344
base 6 of 4611686018427387904: 550120301313313111041104
base 7 of -10: 45012021522523134134556
base 7 of -1: 45012021522523134134601
base 7 of 0: 0
base 7 of 10: 13
base 7 of 100: 202
base 7 of 1000: 2626
base 7 of 4611686018427387904: 11154003640456024361134
base 8 of -10: 01777777777777777777766
base 8 of -1: 01777777777777777777777
base 8 of 0: 0
base 8 of 10: 012
base 8 of 100: 0144
base 8 of 1000: 01750
base 8 of 4611686018427387904: 0400000000000000000000
base 9 of -10: 145808576354216723746
base 9 of -1: 145808576354216723756
base 9 of 0: 0
base 9 of 10: 11
base 9 of 100: 121
base 9 of 1000: 1331
base 9 of 4611686018427387904: 33646586081048405414
base 10 of -10: -10
base 10 of -1: -1
base 10 of 0: 0
base 10 of 10: 10
base 10 of 100: 100
base 10 of 1000: 1000
base 10 of 4611686018427387904: 4611686018427387904
base 11 of -10: 335500516a429071276
base 11 of -1: 335500516a429071284
base 11 of 0: 0
base 11 of 10: a
base 11 of 100: 91
base 11 of 1000: 82a
base 11 of 4611686018427387904: 9140013181078458a4
base 12 of -10: 839365134a2a240706
base 12 of -1: 839365134a2a240713
base 12 of 0: 0
base 12 of 10: a
base 12 of 100: 84
base 12 of 1000: 6b4
base 12 of 4611686018427387904: 20b3a733a268670194
base 13 of -10: 219505a9511a867b66
base 13 of -1: 219505a9511a867b72
base 13 of 0: 0
base 13 of 10: a
base 13 of 100: 79
base 13 of 1000: 5bc
base 13 of 4611686018427387904: 6c1349246a2881c84
base 14 of -10: 8681049adb03db166
base 14 of -1: 8681049adb03db171
base 14 of 0: 0
base 14 of 10: a
base 14 of 100: 72
base 14 of 1000: 516
base 14 of 4611686018427387904: 219038263637dd3c4
base 15 of -10: 2c1d56b648c6cd106
base 15 of -1: 2c1d56b648c6cd110
base 15 of 0: 0
base 15 of 10: a
base 15 of 100: 6a
base 15 of 1000: 46a
base 15 of 4611686018427387904: a7e8ce189a933404
base 16 of -10: 0xfffffffffffffff6
base 16 of -1: 0xffffffffffffffff
base 16 of 0: 0x0
base 16 of 10: 0xa
base 16 of 100: 0x64
base 16 of 1000: 0x3e8
base 16 of 4611686018427387904: 0x4000000000000000
base 17 of -10: 67979g60f5428008
base 17 of -1: 67979g60f5428010
base 17 of 0: 0
base 17 of 10: a
base 17 of 100: 5f
base 17 of 1000: 37e
base 17 of 4611686018427387904: 1a6a6ca03e10a88d
base 18 of -10: 2d3fgb0b9cg4bd26
base 18 of -1: 2d3fgb0b9cg4bd2f
base 18 of 0: 0
base 18 of 10: a
base 18 of 100: 5a
base 18 of 1000: 31a
base 18 of 4611686018427387904: c588bdbfgd12ge4
base 19 of -10: 141c8786h1ccaag7
base 19 of -1: 141c8786h1ccaagg
base 19 of 0: 0
base 19 of 10: a
base 19 of 100: 55
base 19 of 1000: 2ec
base 19 of 4611686018427387904: 5ecbb6fi9h7ggi9
base 20 of -10: b53bjh07be4dj06
base 20 of -1: b53bjh07be4dj0f
base 20 of 0: 0
base 20 of 10: a
base 20 of 100: 50
base 20 of 1000: 2a0
base 20 of 4611686018427387904: 2g5hjj51hib39f4
base 21 of -10: 5e8g4ggg7g56di6
base 21 of -1: 5e8g4ggg7g56dif
base 21 of 0: 0
base 21 of 10: a
base 21 of 100: 4g
base 21 of 1000: 25d
base 21 of 4611686018427387904: 18hjgjjjhebh8f4
base 22 of -10: 2l4lf104353j8k6
base 22 of -1: 2l4lf104353j8kf
base 22 of 0: 0
base 22 of 10: a
base 22 of 100: 4c
base 22 of 1000: 21a
base 22 of 4611686018427387904: g6g95gc0hha7g4
base 23 of -10: 1ddh88h2782i50j
base 23 of -1: 1ddh88h2782i515
base 23 of 0: 0
base 23 of 10: a
base 23 of 100: 48
base 23 of 1000: 1kb
base 23 of 4611686018427387904: 93a22467dc4chd
base 24 of -10: l12ee5fn0ji1i6
base 24 of -1: l12ee5fn0ji1if
base 24 of 0: 0
base 24 of 10: a
base 24 of 100: 44
base 24 of 1000: 1hg
base 24 of 4611686018427387904: 566ffd9ni4mcag
base 25 of -10: c9c336o0mlb7e6
base 25 of -1: c9c336o0mlb7ef
base 25 of 0: 0
base 25 of 10: a
base 25 of 100: 40
base 25 of 1000: 1f0
base 25 of 4611686018427387904: 32970kc6bo2kg4
base 26 of -10: 7b7n2pcniokcg6
base 26 of -1: 7b7n2pcniokcgf
base 26 of 0: 0
base 26 of 10: a
base 26 of 100: 3m
base 26 of 1000: 1cc
base 26 of 4611686018427387904: 1m8c769io65344
base 27 of -10: 4eo8hfam6fllmf
base 27 of -1: 4eo8hfam6fllmo
base 27 of 0: 0
base 27 of 10: a
base 27 of 100: 3j
base 27 of 1000: 1a1
base 27 of 4611686018427387904: 13jfho2j1hc5cd
base 28 of -10: 2nc6j26l66rho6
base 28 of -1: 2nc6j26l66rhof
base 28 of 0: 0
base 28 of 10: a
base 28 of 100: 3g
base 28 of 1000: 17k
base 28 of 4611686018427387904: jo1ilfj8fkpd4
base 29 of -10: 1n3rsh11f098re
base 29 of -1: 1n3rsh11f098rn
base 29 of 0: 0
base 29 of 10: a
base 29 of 100: 3d
base 29 of 1000: 15e
base 29 of 4611686018427387904: d0slim0b029e6
base 30 of -10: 14l9lkmo30o406
base 30 of -1: 14l9lkmo30o40f
base 30 of 0: 0
base 30 of 10: a
base 30 of 100: 3a
base 30 of 1000: 13a
base 30 of 4611686018427387904: 8k9rrkl0ml104
base 31 of -10: nd075ib45k866
base 31 of -1: nd075ib45k86f
base 31 of 0: 0
base 31 of 10: a
base 31 of 100: 37
base 31 of 1000: 118
base 31 of 4611686018427387904: 5qfh94i8okhh4
base 32 of -10: fvvvvvvvvvvvm
base 32 of -1: fvvvvvvvvvvvv
base 32 of 0: 0
base 32 of 10: a
base 32 of 100: 34
base 32 of 1000: v8
base 32 of 4611686018427387904: 4000000000000
base 33 of -10: b1w8p7j5q9r66
base 33 of -1: b1w8p7j5q9r6f
base 33 of 0: 0
base 33 of 10: a
base 33 of 100: 31
base 33 of 1000: ua
base 33 of 4611686018427387904: 2p826a4q6ivi4
base 34 of -10: 7orp63sh4dph8
base 34 of -1: 7orp63sh4dphh
base 34 of 0: 0
base 34 of 10: a
base 34 of 100: 2w
base 34 of 1000: te
base 34 of 4611686018427387904: 1vnvr0wl9ketu
base 35 of -10: 5g24a25twkwf6
base 35 of -1: 5g24a25twkwff
base 35 of 0: 0
base 35 of 10: a
base 35 of 100: 2u
base 35 of 1000: sk
base 35 of 4611686018427387904: 1cqrb9a7gvgu4
base 36 of -10: 3w5e11264sgs6
base 36 of -1: 3w5e11264sgsf
base 36 of 0: 0
base 36 of 10: a
base 36 of 100: 2s
base 36 of 1000: rs
base 36 of 4611686018427387904: z1ci99jj7474
base 37 of -10: <error>
base 37 of -1: <error>
base 37 of 0: <error>
base 37 of 10: <error>
base 37 of 100: <error>
base 37 of 1000: <error>
base 37 of 4611686018427387904: <error>
base 38 of -10: <error>
base 38 of -1: <error>
base 38 of 0: <error>
base 38 of 10: <error>
base 38 of 100: <error>
base 38 of 1000: <error>
base 38 of 4611686018427387904: <error>
base 39 of -10: <error>
base 39 of -1: <error>
base 39 of 0: <error>
base 39 of 10: <error>
base 39 of 100: <error>
base 39 of 1000: <error>
base 39 of 4611686018427387904: <error>
base 40 of -10: <error>
base 40 of -1: <error>
base 40 of 0: <error>
base 40 of 10: <error>
base 40 of 100: <error>
base 40 of 1000: <error>
base 40 of 4611686018427387904: <error>

View file

@ -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);
}

View file

@ -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);
}

View file

@ -117,8 +117,10 @@
#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_1_8_1 DT_VERSION_NUMBER(1, 8, 1)
#define DT_VERS_LATEST DT_VERS_1_8_1
#define DT_VERS_STRING "Sun D 1.8.1"
const dt_version_t _dtrace_versions[] = {
DT_VERS_1_0, /* D API 1.0.0 (PSARC 2001/466) Solaris 10 FCS */
@ -136,6 +138,8 @@ const dt_version_t _dtrace_versions[] = {
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 */
DT_VERS_1_8_1, /* D API 1.8.1 */
0
};
@ -291,7 +295,7 @@ static const dt_ident_t _dtrace_globals[] = {
{ "jstack", DT_IDENT_ACTFUNC, 0, DT_ACT_JSTACK, DT_ATTR_STABCMN, DT_VERS_1_0,
&dt_idops_func, "stack(...)" },
{ "lltostr", DT_IDENT_FUNC, 0, DIF_SUBR_LLTOSTR, DT_ATTR_STABCMN, DT_VERS_1_0,
&dt_idops_func, "string(int64_t)" },
&dt_idops_func, "string(int64_t, [int])" },
{ "llquantize", DT_IDENT_AGGFUNC, 0, DTRACEAGG_LLQUANTIZE, DT_ATTR_STABCMN,
DT_VERS_1_7, &dt_idops_func,
"void(@, int32_t, int32_t, int32_t, int32_t, ...)" },
@ -459,6 +463,10 @@ static const dt_ident_t _dtrace_globals[] = {
{ "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,

View file

@ -4019,6 +4019,53 @@ dtrace_dif_subr(uint_t subr, uint_t rd, uint64_t *regs,
break;
}
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] = 0;
break;
}
if (!DTRACE_INSCRATCH(mstate, size)) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
regs[rd] = 0;
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;
}
#if defined(sun)
case DIF_SUBR_GETMAJOR:
#ifdef _LP64
@ -4283,9 +4330,20 @@ dtrace_dif_subr(uint_t subr, uint_t rd, uint64_t *regs,
case DIF_SUBR_LLTOSTR: {
int64_t i = (int64_t)tupregs[0].dttk_value;
int64_t val = i < 0 ? i * -1 : i;
uint64_t size = 22; /* enough room for 2^64 in decimal */
uint64_t val, digit;
uint64_t size = 65; /* enough room for 2^64 in binary */
char *end = (char *)mstate->dtms_scratch_ptr + size - 1;
int base = 10;
if (nargs > 1) {
if ((base = tupregs[1].dttk_value) <= 1 ||
base > ('z' - 'a' + 1) + ('9' - '0' + 1)) {
*flags |= CPU_DTRACE_ILLOP;
break;
}
}
val = (base == 10 && i < 0) ? i * -1 : i;
if (!DTRACE_INSCRATCH(mstate, size)) {
DTRACE_CPUFLAG_SET(CPU_DTRACE_NOSCRATCH);
@ -4293,13 +4351,24 @@ dtrace_dif_subr(uint_t subr, uint_t rd, uint64_t *regs,
break;
}
for (*end-- = '\0'; val; val /= 10)
*end-- = '0' + (val % 10);
for (*end-- = '\0'; val; val /= base) {
if ((digit = val % base) <= '9' - '0') {
*end-- = '0' + digit;
} else {
*end-- = 'a' + (digit - ('9' - '0') - 1);
}
}
if (i == 0)
if (i == 0 && base == 16)
*end-- = '0';
if (i < 0)
if (base == 16)
*end-- = 'x';
if (i == 0 || base == 8 || base == 16)
*end-- = '0';
if (i < 0 && base == 10)
*end-- = '-';
regs[rd] = (uintptr_t)end + 1;

View file

@ -303,13 +303,15 @@ typedef enum dtrace_probespec {
#define DIF_SUBR_INET_NTOP 41
#define DIF_SUBR_INET_NTOA 42
#define DIF_SUBR_INET_NTOA6 43
#define DIF_SUBR_MEMREF 44
#define DIF_SUBR_TYPEREF 45
#define DIF_SUBR_SX_SHARED_HELD 46
#define DIF_SUBR_SX_EXCLUSIVE_HELD 47
#define DIF_SUBR_SX_ISEXCLUSIVE 48
#define DIF_SUBR_TOUPPER 44
#define DIF_SUBR_TOLOWER 45
#define DIF_SUBR_MEMREF 46
#define DIF_SUBR_TYPEREF 47
#define DIF_SUBR_SX_SHARED_HELD 48
#define DIF_SUBR_SX_EXCLUSIVE_HELD 49
#define DIF_SUBR_SX_ISEXCLUSIVE 50
#define DIF_SUBR_MAX 48 /* max subroutine value */
#define DIF_SUBR_MAX 50 /* max subroutine value */
typedef uint32_t dif_instr_t;