1*4f0ce1daSGordon Ross /*
2*4f0ce1daSGordon Ross * This file and its contents are supplied under the terms of the
3*4f0ce1daSGordon Ross * Common Development and Distribution License ("CDDL"), version 1.0.
4*4f0ce1daSGordon Ross * You may only use this file in accordance with the terms of version
5*4f0ce1daSGordon Ross * 1.0 of the CDDL.
6*4f0ce1daSGordon Ross *
7*4f0ce1daSGordon Ross * A full copy of the text of the CDDL should have accompanied this
8*4f0ce1daSGordon Ross * source. A copy of the CDDL is also available via the Internet at
9*4f0ce1daSGordon Ross * http://www.illumos.org/license/CDDL.
10*4f0ce1daSGordon Ross */
11*4f0ce1daSGordon Ross
12*4f0ce1daSGordon Ross /*
13*4f0ce1daSGordon Ross * Copyright 2021 Tintri by DDN, Inc. All rights reserved.
14*4f0ce1daSGordon Ross */
15*4f0ce1daSGordon Ross
16*4f0ce1daSGordon Ross #include <stdio.h>
17*4f0ce1daSGordon Ross #include <strings.h>
18*4f0ce1daSGordon Ross #include <sys/cmn_err.h>
19*4f0ce1daSGordon Ross #include <sys/varargs.h>
20*4f0ce1daSGordon Ross
21*4f0ce1daSGordon Ross #include "utils.h"
22*4f0ce1daSGordon Ross
23*4f0ce1daSGordon Ross void
hexdump(const uchar_t * buf,int len)24*4f0ce1daSGordon Ross hexdump(const uchar_t *buf, int len)
25*4f0ce1daSGordon Ross {
26*4f0ce1daSGordon Ross int idx;
27*4f0ce1daSGordon Ross char ascii[24];
28*4f0ce1daSGordon Ross char *pa = ascii;
29*4f0ce1daSGordon Ross
30*4f0ce1daSGordon Ross bzero(ascii, sizeof (ascii));
31*4f0ce1daSGordon Ross
32*4f0ce1daSGordon Ross idx = 0;
33*4f0ce1daSGordon Ross while (len--) {
34*4f0ce1daSGordon Ross if ((idx & 15) == 0) {
35*4f0ce1daSGordon Ross printf("%04X: ", idx);
36*4f0ce1daSGordon Ross pa = ascii;
37*4f0ce1daSGordon Ross }
38*4f0ce1daSGordon Ross if (*buf > ' ' && *buf <= '~')
39*4f0ce1daSGordon Ross *pa++ = *buf;
40*4f0ce1daSGordon Ross else
41*4f0ce1daSGordon Ross *pa++ = '.';
42*4f0ce1daSGordon Ross printf("%02x ", *buf++);
43*4f0ce1daSGordon Ross
44*4f0ce1daSGordon Ross idx++;
45*4f0ce1daSGordon Ross if ((idx & 3) == 0) {
46*4f0ce1daSGordon Ross *pa++ = ' ';
47*4f0ce1daSGordon Ross (void) putchar(' ');
48*4f0ce1daSGordon Ross }
49*4f0ce1daSGordon Ross if ((idx & 15) == 0) {
50*4f0ce1daSGordon Ross *pa = '\0';
51*4f0ce1daSGordon Ross printf("%s\n", ascii);
52*4f0ce1daSGordon Ross }
53*4f0ce1daSGordon Ross }
54*4f0ce1daSGordon Ross
55*4f0ce1daSGordon Ross if ((idx & 15) != 0) {
56*4f0ce1daSGordon Ross *pa = '\0';
57*4f0ce1daSGordon Ross /* column align the last ascii row */
58*4f0ce1daSGordon Ross while ((idx & 15) != 0) {
59*4f0ce1daSGordon Ross if ((idx & 3) == 0)
60*4f0ce1daSGordon Ross (void) putchar(' ');
61*4f0ce1daSGordon Ross printf(" ");
62*4f0ce1daSGordon Ross idx++;
63*4f0ce1daSGordon Ross }
64*4f0ce1daSGordon Ross printf("%s\n", ascii);
65*4f0ce1daSGordon Ross }
66*4f0ce1daSGordon Ross }
67*4f0ce1daSGordon Ross
68*4f0ce1daSGordon Ross /*
69*4f0ce1daSGordon Ross * Provide a real function (one that prints something) to replace
70*4f0ce1daSGordon Ross * the stub in libfakekernel. This prints cmn_err() messages.
71*4f0ce1daSGordon Ross */
72*4f0ce1daSGordon Ross void
fakekernel_putlog(char * msg,size_t len,int flags)73*4f0ce1daSGordon Ross fakekernel_putlog(char *msg, size_t len, int flags)
74*4f0ce1daSGordon Ross {
75*4f0ce1daSGordon Ross
76*4f0ce1daSGordon Ross (void) fwrite(msg, 1, len, stdout);
77*4f0ce1daSGordon Ross (void) fflush(stdout);
78*4f0ce1daSGordon Ross }
79*4f0ce1daSGordon Ross
80*4f0ce1daSGordon Ross /*
81*4f0ce1daSGordon Ross * Build a UIO for the input or output buffer
82*4f0ce1daSGordon Ross * Arbitrarily splits into 2 segs for testing uio.
83*4f0ce1daSGordon Ross */
84*4f0ce1daSGordon Ross void
make_uio(void * buf,size_t buflen,uio_t * uio,iovec_t * iov,int iovmax)85*4f0ce1daSGordon Ross make_uio(void *buf, size_t buflen, uio_t *uio, iovec_t *iov, int iovmax)
86*4f0ce1daSGordon Ross {
87*4f0ce1daSGordon Ross size_t maxseg = 512;
88*4f0ce1daSGordon Ross size_t tlen;
89*4f0ce1daSGordon Ross int i;
90*4f0ce1daSGordon Ross
91*4f0ce1daSGordon Ross bzero(uio, sizeof (*uio));
92*4f0ce1daSGordon Ross uio->uio_resid = buflen;
93*4f0ce1daSGordon Ross uio->uio_segflg = UIO_SYSSPACE;
94*4f0ce1daSGordon Ross
95*4f0ce1daSGordon Ross for (i = 0; i < iovmax; i++) {
96*4f0ce1daSGordon Ross if (buflen <= 0)
97*4f0ce1daSGordon Ross break;
98*4f0ce1daSGordon Ross tlen = buflen;
99*4f0ce1daSGordon Ross if (tlen > maxseg)
100*4f0ce1daSGordon Ross tlen = maxseg;
101*4f0ce1daSGordon Ross iov[i].iov_base = buf;
102*4f0ce1daSGordon Ross iov[i].iov_len = tlen;
103*4f0ce1daSGordon Ross buf += tlen;
104*4f0ce1daSGordon Ross buflen -= tlen;
105*4f0ce1daSGordon Ross }
106*4f0ce1daSGordon Ross
107*4f0ce1daSGordon Ross uio->uio_iov = iov;
108*4f0ce1daSGordon Ross uio->uio_iovcnt = i;
109*4f0ce1daSGordon Ross }
110