190075Sobrien/******************************************************************************
2169689Skan *
3169689Skan * Module Name: utbuffer - Buffer dump routines
490075Sobrien *
590075Sobrien *****************************************************************************/
690075Sobrien
790075Sobrien/*
890075Sobrien * Copyright (C) 2000 - 2015, Intel Corp.
990075Sobrien * All rights reserved.
1090075Sobrien *
1190075Sobrien * Redistribution and use in source and binary forms, with or without
1290075Sobrien * modification, are permitted provided that the following conditions
1390075Sobrien * are met:
1490075Sobrien * 1. Redistributions of source code must retain the above copyright
1590075Sobrien *    notice, this list of conditions, and the following disclaimer,
1690075Sobrien *    without modification.
17169689Skan * 2. Redistributions in binary form must reproduce at minimum a disclaimer
1890075Sobrien *    substantially similar to the "NO WARRANTY" disclaimer below
1990075Sobrien *    ("Disclaimer") and any redistribution must be conditioned upon
2090075Sobrien *    including a substantially similar Disclaimer requirement for further
2190075Sobrien *    binary redistribution.
2290075Sobrien * 3. Neither the names of the above-listed copyright holders nor the names
2390075Sobrien *    of any contributors may be used to endorse or promote products derived
2490075Sobrien *    from this software without specific prior written permission.
2590075Sobrien *
2690075Sobrien * Alternatively, this software may be distributed under the terms of the
2790075Sobrien * GNU General Public License ("GPL") version 2 as published by the Free
2890075Sobrien * Software Foundation.
2990075Sobrien *
3090075Sobrien * NO WARRANTY
3190075Sobrien * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3290075Sobrien * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3390075Sobrien * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34169689Skan * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3590075Sobrien * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36169689Skan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37169689Skan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3890075Sobrien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39169689Skan * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40169689Skan * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
4190075Sobrien * POSSIBILITY OF SUCH DAMAGES.
4290075Sobrien */
4390075Sobrien
4490075Sobrien#include <contrib/dev/acpica/include/acpi.h>
4590075Sobrien#include <contrib/dev/acpica/include/accommon.h>
4690075Sobrien
4790075Sobrien#define _COMPONENT          ACPI_UTILITIES
4890075Sobrien        ACPI_MODULE_NAME    ("utbuffer")
49132718Skan
5090075Sobrien
5190075Sobrien/*******************************************************************************
5290075Sobrien *
5390075Sobrien * FUNCTION:    AcpiUtDumpBuffer
5490075Sobrien *
5590075Sobrien * PARAMETERS:  Buffer              - Buffer to dump
5690075Sobrien *              Count               - Amount to dump, in bytes
5790075Sobrien *              Display             - BYTE, WORD, DWORD, or QWORD display:
5890075Sobrien *                                      DB_BYTE_DISPLAY
59132718Skan *                                      DB_WORD_DISPLAY
6090075Sobrien *                                      DB_DWORD_DISPLAY
6190075Sobrien *                                      DB_QWORD_DISPLAY
6290075Sobrien *              BaseOffset          - Beginning buffer offset (display only)
63117395Skan *
64117395Skan * RETURN:      None
65117395Skan *
66169689Skan * DESCRIPTION: Generic dump buffer in both hex and ascii.
67169689Skan *
68169689Skan ******************************************************************************/
69169689Skan
70169689Skanvoid
71169689SkanAcpiUtDumpBuffer (
72169689Skan    UINT8                   *Buffer,
73169689Skan    UINT32                  Count,
74169689Skan    UINT32                  Display,
75169689Skan    UINT32                  BaseOffset)
76169689Skan{
77169689Skan    UINT32                  i = 0;
78169689Skan    UINT32                  j;
79132718Skan    UINT32                  Temp32;
80132718Skan    UINT8                   BufChar;
81132718Skan
82117395Skan
83169689Skan    if (!Buffer)
84169689Skan    {
85169689Skan        AcpiOsPrintf ("Null Buffer Pointer in DumpBuffer!\n");
86169689Skan        return;
87117395Skan    }
88117395Skan
89117395Skan    if ((Count < 4) || (Count & 0x01))
90117395Skan    {
9190075Sobrien        Display = DB_BYTE_DISPLAY;
9290075Sobrien    }
9390075Sobrien
9490075Sobrien    /* Nasty little dump buffer routine! */
9590075Sobrien
96169689Skan    while (i < Count)
97169689Skan    {
98169689Skan        /* Print current offset */
99169689Skan
100117395Skan        AcpiOsPrintf ("%6.4X: ", (BaseOffset + i));
101117395Skan
102117395Skan        /* Print 16 hex chars */
103117395Skan
104117395Skan        for (j = 0; j < 16;)
105117395Skan        {
106117395Skan            if (i + j >= Count)
107117395Skan            {
108169689Skan                /* Dump fill spaces */
109169689Skan
110169689Skan                AcpiOsPrintf ("%*s", ((Display * 2) + 1), " ");
111169689Skan                j += Display;
112117395Skan                continue;
113117395Skan            }
114117395Skan
115117395Skan            switch (Display)
11690075Sobrien            {
11790075Sobrien            case DB_BYTE_DISPLAY:
11890075Sobrien            default:    /* Default is BYTE display */
11990075Sobrien
12090075Sobrien                AcpiOsPrintf ("%02X ", Buffer[(ACPI_SIZE) i + j]);
12190075Sobrien                break;
12290075Sobrien
12390075Sobrien            case DB_WORD_DISPLAY:
12490075Sobrien
12590075Sobrien                ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
12690075Sobrien                AcpiOsPrintf ("%04X ", Temp32);
12790075Sobrien                break;
12890075Sobrien
12990075Sobrien            case DB_DWORD_DISPLAY:
13090075Sobrien
13190075Sobrien                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
13290075Sobrien                AcpiOsPrintf ("%08X ", Temp32);
13390075Sobrien                break;
13490075Sobrien
13590075Sobrien            case DB_QWORD_DISPLAY:
13690075Sobrien
13790075Sobrien                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
13890075Sobrien                AcpiOsPrintf ("%08X", Temp32);
13990075Sobrien
140117395Skan                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]);
141117395Skan                AcpiOsPrintf ("%08X ", Temp32);
142117395Skan                break;
143169689Skan            }
144169689Skan
145169689Skan            j += Display;
146169689Skan        }
147169689Skan
148169689Skan        /*
149169689Skan         * Print the ASCII equivalent characters but watch out for the bad
150169689Skan         * unprintable ones (printable chars are 0x20 through 0x7E)
15190075Sobrien         */
15290075Sobrien        AcpiOsPrintf (" ");
153169689Skan        for (j = 0; j < 16; j++)
154169689Skan        {
155169689Skan            if (i + j >= Count)
156169689Skan            {
157169689Skan                AcpiOsPrintf ("\n");
158169689Skan                return;
159169689Skan            }
160169689Skan
16190075Sobrien            /*
16290075Sobrien             * Add comment characters so rest of line is ignored when
16390075Sobrien             * compiled
16490075Sobrien             */
16590075Sobrien            if (j == 0)
16690075Sobrien            {
16790075Sobrien                AcpiOsPrintf ("// ");
168169689Skan            }
169169689Skan
170169689Skan            BufChar = Buffer[(ACPI_SIZE) i + j];
171169689Skan            if (ACPI_IS_PRINT (BufChar))
172169689Skan            {
173169689Skan                AcpiOsPrintf ("%c", BufChar);
174169689Skan            }
175169689Skan            else
176117395Skan            {
177117395Skan                AcpiOsPrintf (".");
178117395Skan            }
179117395Skan        }
180117395Skan
181117395Skan        /* Done with that line. */
182117395Skan
183117395Skan        AcpiOsPrintf ("\n");
184117395Skan        i += 16;
185117395Skan    }
186117395Skan
187117395Skan    return;
188117395Skan}
189117395Skan
190117395Skan
191117395Skan/*******************************************************************************
192132718Skan *
193132718Skan * FUNCTION:    AcpiUtDebugDumpBuffer
194132718Skan *
195132718Skan * PARAMETERS:  Buffer              - Buffer to dump
196132718Skan *              Count               - Amount to dump, in bytes
197132718Skan *              Display             - BYTE, WORD, DWORD, or QWORD display:
198132718Skan *                                      DB_BYTE_DISPLAY
199132718Skan *                                      DB_WORD_DISPLAY
200132718Skan *                                      DB_DWORD_DISPLAY
201132718Skan *                                      DB_QWORD_DISPLAY
202169689Skan *              ComponentID         - Caller's component ID
203169689Skan *
204169689Skan * RETURN:      None
205169689Skan *
206132718Skan * DESCRIPTION: Generic dump buffer in both hex and ascii.
207132718Skan *
208132718Skan ******************************************************************************/
209132718Skan
210132718Skanvoid
211132718SkanAcpiUtDebugDumpBuffer (
212132718Skan    UINT8                   *Buffer,
213132718Skan    UINT32                  Count,
214132718Skan    UINT32                  Display,
215132718Skan    UINT32                  ComponentId)
216132718Skan{
217132718Skan
218169689Skan    /* Only dump the buffer if tracing is enabled */
219169689Skan
220169689Skan    if (!((ACPI_LV_TABLES & AcpiDbgLevel) &&
221169689Skan        (ComponentId & AcpiDbgLayer)))
222169689Skan    {
223169689Skan        return;
224169689Skan    }
225169689Skan
226169689Skan    AcpiUtDumpBuffer (Buffer, Count, Display, 0);
227169689Skan}
228169689Skan
229169689Skan
230169689Skan#ifdef ACPI_APPLICATION
231169689Skan/*******************************************************************************
232169689Skan *
233169689Skan * FUNCTION:    AcpiUtDumpBufferToFile
23490075Sobrien *
23590075Sobrien * PARAMETERS:  File                - File descriptor
23690075Sobrien *              Buffer              - Buffer to dump
23790075Sobrien *              Count               - Amount to dump, in bytes
23890075Sobrien *              Display             - BYTE, WORD, DWORD, or QWORD display:
23990075Sobrien *                                      DB_BYTE_DISPLAY
24090075Sobrien *                                      DB_WORD_DISPLAY
24190075Sobrien *                                      DB_DWORD_DISPLAY
24290075Sobrien *                                      DB_QWORD_DISPLAY
24390075Sobrien *              BaseOffset          - Beginning buffer offset (display only)
24490075Sobrien *
24590075Sobrien * RETURN:      None
24690075Sobrien *
24790075Sobrien * DESCRIPTION: Generic dump buffer in both hex and ascii to a file.
24890075Sobrien *
24990075Sobrien ******************************************************************************/
25090075Sobrien
25190075Sobrienvoid
252117395SkanAcpiUtDumpBufferToFile (
253169689Skan    ACPI_FILE               File,
254169689Skan    UINT8                   *Buffer,
255169689Skan    UINT32                  Count,
256132718Skan    UINT32                  Display,
257169689Skan    UINT32                  BaseOffset)
258117395Skan{
25990075Sobrien    UINT32                  i = 0;
26090075Sobrien    UINT32                  j;
26190075Sobrien    UINT32                  Temp32;
26290075Sobrien    UINT8                   BufChar;
263169689Skan
26490075Sobrien
265169689Skan    if (!Buffer)
266117395Skan    {
267117395Skan        AcpiUtFilePrintf (File, "Null Buffer Pointer in DumpBuffer!\n");
268117395Skan        return;
269169689Skan    }
27090075Sobrien
271117395Skan    if ((Count < 4) || (Count & 0x01))
272117395Skan    {
273132718Skan        Display = DB_BYTE_DISPLAY;
274132718Skan    }
275132718Skan
276169689Skan    /* Nasty little dump buffer routine! */
277169689Skan
278169689Skan    while (i < Count)
279169689Skan    {
28090075Sobrien        /* Print current offset */
28190075Sobrien
28290075Sobrien        AcpiUtFilePrintf (File, "%6.4X: ", (BaseOffset + i));
28390075Sobrien
28490075Sobrien        /* Print 16 hex chars */
28590075Sobrien
28690075Sobrien        for (j = 0; j < 16;)
28790075Sobrien        {
28890075Sobrien            if (i + j >= Count)
289169689Skan            {
290169689Skan                /* Dump fill spaces */
29190075Sobrien
29290075Sobrien                AcpiUtFilePrintf (File, "%*s", ((Display * 2) + 1), " ");
293132718Skan                j += Display;
294117395Skan                continue;
295117395Skan            }
296117395Skan
297117395Skan            switch (Display)
298117395Skan            {
299132718Skan            case DB_BYTE_DISPLAY:
300132718Skan            default:    /* Default is BYTE display */
301132718Skan
302169689Skan                AcpiUtFilePrintf (File, "%02X ", Buffer[(ACPI_SIZE) i + j]);
303169689Skan                break;
304169689Skan
305169689Skan            case DB_WORD_DISPLAY:
306169689Skan
307169689Skan                ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
308169689Skan                AcpiUtFilePrintf (File, "%04X ", Temp32);
30990075Sobrien                break;
310169689Skan
311117395Skan            case DB_DWORD_DISPLAY:
312117395Skan
313117395Skan                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
314117395Skan                AcpiUtFilePrintf (File, "%08X ", Temp32);
315117395Skan                break;
316117395Skan
317117395Skan            case DB_QWORD_DISPLAY:
318169689Skan
319169689Skan                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
320117395Skan                AcpiUtFilePrintf (File, "%08X", Temp32);
321117395Skan
322132718Skan                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]);
323117395Skan                AcpiUtFilePrintf (File, "%08X ", Temp32);
324117395Skan                break;
325117395Skan            }
326117395Skan
327117395Skan            j += Display;
328132718Skan        }
329132718Skan
330169689Skan        /*
331169689Skan         * Print the ASCII equivalent characters but watch out for the bad
332169689Skan         * unprintable ones (printable chars are 0x20 through 0x7E)
333169689Skan         */
334169689Skan        AcpiUtFilePrintf (File, " ");
335169689Skan        for (j = 0; j < 16; j++)
336169689Skan        {
337169689Skan            if (i + j >= Count)
33890075Sobrien            {
339169689Skan                AcpiUtFilePrintf (File, "\n");
340220150Smm                return;
341220150Smm            }
342169689Skan
343169689Skan            BufChar = Buffer[(ACPI_SIZE) i + j];
344220150Smm            if (ACPI_IS_PRINT (BufChar))
345220150Smm            {
346169689Skan                AcpiUtFilePrintf (File, "%c", BufChar);
347169689Skan            }
348169689Skan            else
349169689Skan            {
350169689Skan                AcpiUtFilePrintf (File, ".");
351169689Skan            }
352169689Skan        }
353169689Skan
354132718Skan        /* Done with that line. */
35590075Sobrien
35690075Sobrien        AcpiUtFilePrintf (File, "\n");
357117395Skan        i += 16;
35890075Sobrien    }
359132718Skan
360132718Skan    return;
361132718Skan}
36290075Sobrien#endif
363132718Skan