1250757Sjkim/******************************************************************************
2250757Sjkim *
3250757Sjkim * Module Name: utbuffer - Buffer dump routines
4250757Sjkim *
5250757Sjkim *****************************************************************************/
6250757Sjkim
7250757Sjkim/*
8298714Sjkim * Copyright (C) 2000 - 2016, Intel Corp.
9250757Sjkim * All rights reserved.
10250757Sjkim *
11250757Sjkim * Redistribution and use in source and binary forms, with or without
12250757Sjkim * modification, are permitted provided that the following conditions
13250757Sjkim * are met:
14250757Sjkim * 1. Redistributions of source code must retain the above copyright
15250757Sjkim *    notice, this list of conditions, and the following disclaimer,
16250757Sjkim *    without modification.
17250757Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18250757Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19250757Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20250757Sjkim *    including a substantially similar Disclaimer requirement for further
21250757Sjkim *    binary redistribution.
22250757Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23250757Sjkim *    of any contributors may be used to endorse or promote products derived
24250757Sjkim *    from this software without specific prior written permission.
25250757Sjkim *
26250757Sjkim * Alternatively, this software may be distributed under the terms of the
27250757Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28250757Sjkim * Software Foundation.
29250757Sjkim *
30250757Sjkim * NO WARRANTY
31250757Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32250757Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33250757Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34250757Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35250757Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36250757Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37250757Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38250757Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39250757Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40250757Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41250757Sjkim * POSSIBILITY OF SUCH DAMAGES.
42250757Sjkim */
43250757Sjkim
44250838Sjkim#include <contrib/dev/acpica/include/acpi.h>
45250838Sjkim#include <contrib/dev/acpica/include/accommon.h>
46250757Sjkim
47250757Sjkim#define _COMPONENT          ACPI_UTILITIES
48250757Sjkim        ACPI_MODULE_NAME    ("utbuffer")
49250757Sjkim
50250757Sjkim
51250757Sjkim/*******************************************************************************
52250757Sjkim *
53250757Sjkim * FUNCTION:    AcpiUtDumpBuffer
54250757Sjkim *
55250757Sjkim * PARAMETERS:  Buffer              - Buffer to dump
56250757Sjkim *              Count               - Amount to dump, in bytes
57250757Sjkim *              Display             - BYTE, WORD, DWORD, or QWORD display:
58250757Sjkim *                                      DB_BYTE_DISPLAY
59250757Sjkim *                                      DB_WORD_DISPLAY
60250757Sjkim *                                      DB_DWORD_DISPLAY
61250757Sjkim *                                      DB_QWORD_DISPLAY
62250757Sjkim *              BaseOffset          - Beginning buffer offset (display only)
63250757Sjkim *
64250757Sjkim * RETURN:      None
65250757Sjkim *
66250757Sjkim * DESCRIPTION: Generic dump buffer in both hex and ascii.
67250757Sjkim *
68250757Sjkim ******************************************************************************/
69250757Sjkim
70250757Sjkimvoid
71250757SjkimAcpiUtDumpBuffer (
72250757Sjkim    UINT8                   *Buffer,
73250757Sjkim    UINT32                  Count,
74250757Sjkim    UINT32                  Display,
75250757Sjkim    UINT32                  BaseOffset)
76250757Sjkim{
77250757Sjkim    UINT32                  i = 0;
78250757Sjkim    UINT32                  j;
79250757Sjkim    UINT32                  Temp32;
80250757Sjkim    UINT8                   BufChar;
81250757Sjkim
82250757Sjkim
83250757Sjkim    if (!Buffer)
84250757Sjkim    {
85250757Sjkim        AcpiOsPrintf ("Null Buffer Pointer in DumpBuffer!\n");
86250757Sjkim        return;
87250757Sjkim    }
88250757Sjkim
89250757Sjkim    if ((Count < 4) || (Count & 0x01))
90250757Sjkim    {
91250757Sjkim        Display = DB_BYTE_DISPLAY;
92250757Sjkim    }
93250757Sjkim
94250757Sjkim    /* Nasty little dump buffer routine! */
95250757Sjkim
96250757Sjkim    while (i < Count)
97250757Sjkim    {
98250757Sjkim        /* Print current offset */
99250757Sjkim
100250757Sjkim        AcpiOsPrintf ("%6.4X: ", (BaseOffset + i));
101250757Sjkim
102250757Sjkim        /* Print 16 hex chars */
103250757Sjkim
104250757Sjkim        for (j = 0; j < 16;)
105250757Sjkim        {
106250757Sjkim            if (i + j >= Count)
107250757Sjkim            {
108250757Sjkim                /* Dump fill spaces */
109250757Sjkim
110250757Sjkim                AcpiOsPrintf ("%*s", ((Display * 2) + 1), " ");
111250757Sjkim                j += Display;
112250757Sjkim                continue;
113250757Sjkim            }
114250757Sjkim
115250757Sjkim            switch (Display)
116250757Sjkim            {
117250757Sjkim            case DB_BYTE_DISPLAY:
118250757Sjkim            default:    /* Default is BYTE display */
119250757Sjkim
120250757Sjkim                AcpiOsPrintf ("%02X ", Buffer[(ACPI_SIZE) i + j]);
121250757Sjkim                break;
122250757Sjkim
123250757Sjkim            case DB_WORD_DISPLAY:
124250757Sjkim
125250757Sjkim                ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
126250757Sjkim                AcpiOsPrintf ("%04X ", Temp32);
127250757Sjkim                break;
128250757Sjkim
129250757Sjkim            case DB_DWORD_DISPLAY:
130250757Sjkim
131250757Sjkim                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
132250757Sjkim                AcpiOsPrintf ("%08X ", Temp32);
133250757Sjkim                break;
134250757Sjkim
135250757Sjkim            case DB_QWORD_DISPLAY:
136250757Sjkim
137250757Sjkim                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
138250757Sjkim                AcpiOsPrintf ("%08X", Temp32);
139250757Sjkim
140250757Sjkim                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]);
141250757Sjkim                AcpiOsPrintf ("%08X ", Temp32);
142250757Sjkim                break;
143250757Sjkim            }
144250757Sjkim
145250757Sjkim            j += Display;
146250757Sjkim        }
147250757Sjkim
148250757Sjkim        /*
149250757Sjkim         * Print the ASCII equivalent characters but watch out for the bad
150250757Sjkim         * unprintable ones (printable chars are 0x20 through 0x7E)
151250757Sjkim         */
152250757Sjkim        AcpiOsPrintf (" ");
153250757Sjkim        for (j = 0; j < 16; j++)
154250757Sjkim        {
155250757Sjkim            if (i + j >= Count)
156250757Sjkim            {
157250757Sjkim                AcpiOsPrintf ("\n");
158250757Sjkim                return;
159250757Sjkim            }
160250757Sjkim
161281396Sjkim            /*
162281396Sjkim             * Add comment characters so rest of line is ignored when
163281396Sjkim             * compiled
164281396Sjkim             */
165281396Sjkim            if (j == 0)
166281396Sjkim            {
167281396Sjkim                AcpiOsPrintf ("// ");
168281396Sjkim            }
169281396Sjkim
170250757Sjkim            BufChar = Buffer[(ACPI_SIZE) i + j];
171284583Sjkim            if (isprint (BufChar))
172250757Sjkim            {
173250757Sjkim                AcpiOsPrintf ("%c", BufChar);
174250757Sjkim            }
175250757Sjkim            else
176250757Sjkim            {
177250757Sjkim                AcpiOsPrintf (".");
178250757Sjkim            }
179250757Sjkim        }
180250757Sjkim
181250757Sjkim        /* Done with that line. */
182250757Sjkim
183250757Sjkim        AcpiOsPrintf ("\n");
184250757Sjkim        i += 16;
185250757Sjkim    }
186250757Sjkim
187250757Sjkim    return;
188250757Sjkim}
189250757Sjkim
190250757Sjkim
191250757Sjkim/*******************************************************************************
192250757Sjkim *
193250757Sjkim * FUNCTION:    AcpiUtDebugDumpBuffer
194250757Sjkim *
195250757Sjkim * PARAMETERS:  Buffer              - Buffer to dump
196250757Sjkim *              Count               - Amount to dump, in bytes
197250757Sjkim *              Display             - BYTE, WORD, DWORD, or QWORD display:
198250757Sjkim *                                      DB_BYTE_DISPLAY
199250757Sjkim *                                      DB_WORD_DISPLAY
200250757Sjkim *                                      DB_DWORD_DISPLAY
201250757Sjkim *                                      DB_QWORD_DISPLAY
202250757Sjkim *              ComponentID         - Caller's component ID
203250757Sjkim *
204250757Sjkim * RETURN:      None
205250757Sjkim *
206250757Sjkim * DESCRIPTION: Generic dump buffer in both hex and ascii.
207250757Sjkim *
208250757Sjkim ******************************************************************************/
209250757Sjkim
210250757Sjkimvoid
211250757SjkimAcpiUtDebugDumpBuffer (
212250757Sjkim    UINT8                   *Buffer,
213250757Sjkim    UINT32                  Count,
214250757Sjkim    UINT32                  Display,
215250757Sjkim    UINT32                  ComponentId)
216250757Sjkim{
217250757Sjkim
218250757Sjkim    /* Only dump the buffer if tracing is enabled */
219250757Sjkim
220250757Sjkim    if (!((ACPI_LV_TABLES & AcpiDbgLevel) &&
221250757Sjkim        (ComponentId & AcpiDbgLayer)))
222250757Sjkim    {
223250757Sjkim        return;
224250757Sjkim    }
225250757Sjkim
226250757Sjkim    AcpiUtDumpBuffer (Buffer, Count, Display, 0);
227250757Sjkim}
228272444Sjkim
229272444Sjkim
230272444Sjkim#ifdef ACPI_APPLICATION
231272444Sjkim/*******************************************************************************
232272444Sjkim *
233272444Sjkim * FUNCTION:    AcpiUtDumpBufferToFile
234272444Sjkim *
235272444Sjkim * PARAMETERS:  File                - File descriptor
236272444Sjkim *              Buffer              - Buffer to dump
237272444Sjkim *              Count               - Amount to dump, in bytes
238272444Sjkim *              Display             - BYTE, WORD, DWORD, or QWORD display:
239272444Sjkim *                                      DB_BYTE_DISPLAY
240272444Sjkim *                                      DB_WORD_DISPLAY
241272444Sjkim *                                      DB_DWORD_DISPLAY
242272444Sjkim *                                      DB_QWORD_DISPLAY
243272444Sjkim *              BaseOffset          - Beginning buffer offset (display only)
244272444Sjkim *
245272444Sjkim * RETURN:      None
246272444Sjkim *
247272444Sjkim * DESCRIPTION: Generic dump buffer in both hex and ascii to a file.
248272444Sjkim *
249272444Sjkim ******************************************************************************/
250272444Sjkim
251272444Sjkimvoid
252272444SjkimAcpiUtDumpBufferToFile (
253272444Sjkim    ACPI_FILE               File,
254272444Sjkim    UINT8                   *Buffer,
255272444Sjkim    UINT32                  Count,
256272444Sjkim    UINT32                  Display,
257272444Sjkim    UINT32                  BaseOffset)
258272444Sjkim{
259272444Sjkim    UINT32                  i = 0;
260272444Sjkim    UINT32                  j;
261272444Sjkim    UINT32                  Temp32;
262272444Sjkim    UINT8                   BufChar;
263272444Sjkim
264272444Sjkim
265272444Sjkim    if (!Buffer)
266272444Sjkim    {
267272444Sjkim        AcpiUtFilePrintf (File, "Null Buffer Pointer in DumpBuffer!\n");
268272444Sjkim        return;
269272444Sjkim    }
270272444Sjkim
271272444Sjkim    if ((Count < 4) || (Count & 0x01))
272272444Sjkim    {
273272444Sjkim        Display = DB_BYTE_DISPLAY;
274272444Sjkim    }
275272444Sjkim
276272444Sjkim    /* Nasty little dump buffer routine! */
277272444Sjkim
278272444Sjkim    while (i < Count)
279272444Sjkim    {
280272444Sjkim        /* Print current offset */
281272444Sjkim
282272444Sjkim        AcpiUtFilePrintf (File, "%6.4X: ", (BaseOffset + i));
283272444Sjkim
284272444Sjkim        /* Print 16 hex chars */
285272444Sjkim
286272444Sjkim        for (j = 0; j < 16;)
287272444Sjkim        {
288272444Sjkim            if (i + j >= Count)
289272444Sjkim            {
290272444Sjkim                /* Dump fill spaces */
291272444Sjkim
292272444Sjkim                AcpiUtFilePrintf (File, "%*s", ((Display * 2) + 1), " ");
293272444Sjkim                j += Display;
294272444Sjkim                continue;
295272444Sjkim            }
296272444Sjkim
297272444Sjkim            switch (Display)
298272444Sjkim            {
299272444Sjkim            case DB_BYTE_DISPLAY:
300272444Sjkim            default:    /* Default is BYTE display */
301272444Sjkim
302272444Sjkim                AcpiUtFilePrintf (File, "%02X ", Buffer[(ACPI_SIZE) i + j]);
303272444Sjkim                break;
304272444Sjkim
305272444Sjkim            case DB_WORD_DISPLAY:
306272444Sjkim
307272444Sjkim                ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
308272444Sjkim                AcpiUtFilePrintf (File, "%04X ", Temp32);
309272444Sjkim                break;
310272444Sjkim
311272444Sjkim            case DB_DWORD_DISPLAY:
312272444Sjkim
313272444Sjkim                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
314272444Sjkim                AcpiUtFilePrintf (File, "%08X ", Temp32);
315272444Sjkim                break;
316272444Sjkim
317272444Sjkim            case DB_QWORD_DISPLAY:
318272444Sjkim
319272444Sjkim                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
320272444Sjkim                AcpiUtFilePrintf (File, "%08X", Temp32);
321272444Sjkim
322272444Sjkim                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]);
323272444Sjkim                AcpiUtFilePrintf (File, "%08X ", Temp32);
324272444Sjkim                break;
325272444Sjkim            }
326272444Sjkim
327272444Sjkim            j += Display;
328272444Sjkim        }
329272444Sjkim
330272444Sjkim        /*
331272444Sjkim         * Print the ASCII equivalent characters but watch out for the bad
332272444Sjkim         * unprintable ones (printable chars are 0x20 through 0x7E)
333272444Sjkim         */
334272444Sjkim        AcpiUtFilePrintf (File, " ");
335272444Sjkim        for (j = 0; j < 16; j++)
336272444Sjkim        {
337272444Sjkim            if (i + j >= Count)
338272444Sjkim            {
339272444Sjkim                AcpiUtFilePrintf (File, "\n");
340272444Sjkim                return;
341272444Sjkim            }
342272444Sjkim
343272444Sjkim            BufChar = Buffer[(ACPI_SIZE) i + j];
344284583Sjkim            if (isprint (BufChar))
345272444Sjkim            {
346272444Sjkim                AcpiUtFilePrintf (File, "%c", BufChar);
347272444Sjkim            }
348272444Sjkim            else
349272444Sjkim            {
350272444Sjkim                AcpiUtFilePrintf (File, ".");
351272444Sjkim            }
352272444Sjkim        }
353272444Sjkim
354272444Sjkim        /* Done with that line. */
355272444Sjkim
356272444Sjkim        AcpiUtFilePrintf (File, "\n");
357272444Sjkim        i += 16;
358272444Sjkim    }
359272444Sjkim
360272444Sjkim    return;
361272444Sjkim}
362272444Sjkim#endif
363