[DTrace-devel] [PATCH 19/61] Handle high-order bits of rand() properly
Kris Van Hees
kris.van.hees at oracle.com
Thu Jul 28 15:03:17 UTC 2022
On Fri, Jul 08, 2022 at 10:45:03AM -0400, eugene.loh--- via DTrace-devel wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
>
> The D rand() function is declared to be "int" -- a 4-byte, signed
> integer. Internally, D represents integers as 64-bit quantities.
> Therefore, after calling the BPF helper function to get 32 random
> bits, we should sign-extend the upper bits.
>
> Meanwhile, the rand_intra test was checking if the uppermost 32 bits
> of "x = rand()" were 0. This makes no sense since x is a signed,
> 4-byte integer and should be populated with 0xffffffff half of the
> time. The test would fail once x is correctly sign-extended (by a
> future patch). Eliminate the check on the upper bits.
>
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>
Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>
... queued for dev
> ---
> libdtrace/dt_cg.c | 4 +++-
> test/unittest/funcs/tst.rand_intra.sh | 15 +++++----------
> 2 files changed, 8 insertions(+), 11 deletions(-)
>
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index 4729710d..633e4613 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -3907,7 +3907,9 @@ dt_cg_subr_rand(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
> dt_regset_free_args(drp);
> emit(dlp, BPF_MOV_REG(dnp->dn_reg, BPF_REG_0));
> dt_regset_free(drp, BPF_REG_0);
> - emit(dlp, BPF_ALU64_IMM(BPF_AND, dnp->dn_reg, 0xffffffff));
> +
> + emit(dlp, BPF_ALU64_IMM(BPF_LSH, dnp->dn_reg, 32));
> + emit(dlp, BPF_ALU64_IMM(BPF_ARSH, dnp->dn_reg, 32));
>
> TRACE_REGSET(" subr-rand:End ");
> }
> diff --git a/test/unittest/funcs/tst.rand_intra.sh b/test/unittest/funcs/tst.rand_intra.sh
> index 0d263fd5..ac1f43e0 100755
> --- a/test/unittest/funcs/tst.rand_intra.sh
> +++ b/test/unittest/funcs/tst.rand_intra.sh
> @@ -14,7 +14,7 @@ niter=25000
> # is, use lquantize to look at the distribution of 4-bit blocks.
>
> $dtrace $dt_flags -q -o $tmpfile -c test/triggers/bogus-ioctl -n '
> -BEGIN { nuperr = n = 0 }
> +BEGIN { n = 0 }
> syscall::ioctl:entry
> /pid == $target/
> {
> @@ -29,13 +29,12 @@ syscall::ioctl:entry
> @g = lquantize((x >> 24) & 0xf, 0, 16, 1);
> @h = lquantize((x >> 28) & 0xf, 0, 16, 1);
>
> - nuperr += (x & 0xffffffff00000000) ? 1 : 0;
> n++;
> }
> syscall::ioctl:entry
> /pid == $target && n >= '$niter'/
> {
> - printf("# of upper-bit errors: %d out of %d\n", nuperr, n);
> + printf("number of iterations: %d\n", n);
> exit(0);
> }'
>
> @@ -53,13 +52,9 @@ awk '
> nbins = 16;
> }
>
> - # process line: "# of upper-bit errors: 0 out of ..."
> - /upper-bit errors/ {
> - if (int($5) != 0) {
> - print "ERROR: found some upper-bit errors";
> - exit 1;
> - }
> - n = int($8);
> + # process line: "number of iterations: ..."
> + /number of iterations:/ {
> + n = int($4);
> if (n != '$niter') {
> print "ERROR: unexpected amount of data";
> exit 1;
> --
> 2.18.4
>
>
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel
More information about the DTrace-devel
mailing list