utbuffer.c revision 250838
1285242Sachim/******************************************************************************
2285242Sachim *
3285242Sachim * Module Name: utbuffer - Buffer dump routines
4285242Sachim *
5285242Sachim *****************************************************************************/
6285242Sachim
7285242Sachim/*
8285242Sachim * Copyright (C) 2000 - 2013, Intel Corp.
9285242Sachim * All rights reserved.
10285242Sachim *
11285242Sachim * Redistribution and use in source and binary forms, with or without
12285242Sachim * modification, are permitted provided that the following conditions
13285242Sachim * are met:
14285242Sachim * 1. Redistributions of source code must retain the above copyright
15285242Sachim *    notice, this list of conditions, and the following disclaimer,
16285242Sachim *    without modification.
17285242Sachim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18285242Sachim *    substantially similar to the "NO WARRANTY" disclaimer below
19285242Sachim *    ("Disclaimer") and any redistribution must be conditioned upon
20285242Sachim *    including a substantially similar Disclaimer requirement for further
21285242Sachim *    binary redistribution.
22285242Sachim * 3. Neither the names of the above-listed copyright holders nor the names
23285242Sachim *    of any contributors may be used to endorse or promote products derived
24285242Sachim *    from this software without specific prior written permission.
25285242Sachim *
26285242Sachim * Alternatively, this software may be distributed under the terms of the
27285242Sachim * GNU General Public License ("GPL") version 2 as published by the Free
28285242Sachim * Software Foundation.
29285242Sachim *
30285242Sachim * NO WARRANTY
31285242Sachim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32285242Sachim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33285242Sachim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34285242Sachim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35285242Sachim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36285242Sachim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37285242Sachim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38285242Sachim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39285242Sachim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40285242Sachim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41285242Sachim * POSSIBILITY OF SUCH DAMAGES.
42285242Sachim */
43285242Sachim
44285242Sachim#define __UTBUFFER_C__
45285242Sachim
46285242Sachim#include <contrib/dev/acpica/include/acpi.h>
47285242Sachim#include <contrib/dev/acpica/include/accommon.h>
48285242Sachim
49285242Sachim#define _COMPONENT          ACPI_UTILITIES
50285242Sachim        ACPI_MODULE_NAME    ("utbuffer")
51285242Sachim
52285242Sachim
53285242Sachim/*******************************************************************************
54285242Sachim *
55285242Sachim * FUNCTION:    AcpiUtDumpBuffer
56285242Sachim *
57285242Sachim * PARAMETERS:  Buffer              - Buffer to dump
58285242Sachim *              Count               - Amount to dump, in bytes
59285242Sachim *              Display             - BYTE, WORD, DWORD, or QWORD display:
60285242Sachim *                                      DB_BYTE_DISPLAY
61285242Sachim *                                      DB_WORD_DISPLAY
62285242Sachim *                                      DB_DWORD_DISPLAY
63285242Sachim *                                      DB_QWORD_DISPLAY
64285242Sachim *              BaseOffset          - Beginning buffer offset (display only)
65285242Sachim *
66285242Sachim * RETURN:      None
67285242Sachim *
68285242Sachim * DESCRIPTION: Generic dump buffer in both hex and ascii.
69285242Sachim *
70285242Sachim ******************************************************************************/
71285242Sachim
72285242Sachimvoid
73285242SachimAcpiUtDumpBuffer (
74285242Sachim    UINT8                   *Buffer,
75285242Sachim    UINT32                  Count,
76285242Sachim    UINT32                  Display,
77285242Sachim    UINT32                  BaseOffset)
78285242Sachim{
79285242Sachim    UINT32                  i = 0;
80285242Sachim    UINT32                  j;
81285242Sachim    UINT32                  Temp32;
82285242Sachim    UINT8                   BufChar;
83285242Sachim
84285242Sachim
85285242Sachim    if (!Buffer)
86285242Sachim    {
87285242Sachim        AcpiOsPrintf ("Null Buffer Pointer in DumpBuffer!\n");
88285242Sachim        return;
89285242Sachim    }
90285242Sachim
91285242Sachim    if ((Count < 4) || (Count & 0x01))
92285242Sachim    {
93285242Sachim        Display = DB_BYTE_DISPLAY;
94285242Sachim    }
95285242Sachim
96285242Sachim    /* Nasty little dump buffer routine! */
97285242Sachim
98285242Sachim    while (i < Count)
99285242Sachim    {
100285242Sachim        /* Print current offset */
101285242Sachim
102285242Sachim        AcpiOsPrintf ("%6.4X: ", (BaseOffset + i));
103285242Sachim
104285242Sachim        /* Print 16 hex chars */
105285242Sachim
106285242Sachim        for (j = 0; j < 16;)
107285242Sachim        {
108285242Sachim            if (i + j >= Count)
109285242Sachim            {
110285242Sachim                /* Dump fill spaces */
111285242Sachim
112285242Sachim                AcpiOsPrintf ("%*s", ((Display * 2) + 1), " ");
113285242Sachim                j += Display;
114285242Sachim                continue;
115285242Sachim            }
116285242Sachim
117285242Sachim            switch (Display)
118285242Sachim            {
119285242Sachim            case DB_BYTE_DISPLAY:
120285242Sachim            default:    /* Default is BYTE display */
121285242Sachim
122285242Sachim                AcpiOsPrintf ("%02X ", Buffer[(ACPI_SIZE) i + j]);
123285242Sachim                break;
124285242Sachim
125285242Sachim            case DB_WORD_DISPLAY:
126285242Sachim
127285242Sachim                ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
128285242Sachim                AcpiOsPrintf ("%04X ", Temp32);
129285242Sachim                break;
130285242Sachim
131285242Sachim            case DB_DWORD_DISPLAY:
132285242Sachim
133285242Sachim                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
134285242Sachim                AcpiOsPrintf ("%08X ", Temp32);
135285242Sachim                break;
136285242Sachim
137285242Sachim            case DB_QWORD_DISPLAY:
138285242Sachim
139285242Sachim                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
140285242Sachim                AcpiOsPrintf ("%08X", Temp32);
141285242Sachim
142285242Sachim                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]);
143285242Sachim                AcpiOsPrintf ("%08X ", Temp32);
144285242Sachim                break;
145285242Sachim            }
146285242Sachim
147285242Sachim            j += Display;
148285242Sachim        }
149285242Sachim
150285242Sachim        /*
151285242Sachim         * Print the ASCII equivalent characters but watch out for the bad
152285242Sachim         * unprintable ones (printable chars are 0x20 through 0x7E)
153285242Sachim         */
154285242Sachim        AcpiOsPrintf (" ");
155285242Sachim        for (j = 0; j < 16; j++)
156285242Sachim        {
157285242Sachim            if (i + j >= Count)
158285242Sachim            {
159285242Sachim                AcpiOsPrintf ("\n");
160285242Sachim                return;
161285242Sachim            }
162285242Sachim
163285242Sachim            BufChar = Buffer[(ACPI_SIZE) i + j];
164285242Sachim            if (ACPI_IS_PRINT (BufChar))
165285242Sachim            {
166285242Sachim                AcpiOsPrintf ("%c", BufChar);
167285242Sachim            }
168285242Sachim            else
169285242Sachim            {
170285242Sachim                AcpiOsPrintf (".");
171285242Sachim            }
172285242Sachim        }
173285242Sachim
174285242Sachim        /* Done with that line. */
175285242Sachim
176285242Sachim        AcpiOsPrintf ("\n");
177285242Sachim        i += 16;
178285242Sachim    }
179285242Sachim
180285242Sachim    return;
181285242Sachim}
182285242Sachim
183285242Sachim
184285242Sachim/*******************************************************************************
185285242Sachim *
186285242Sachim * FUNCTION:    AcpiUtDebugDumpBuffer
187285242Sachim *
188285242Sachim * PARAMETERS:  Buffer              - Buffer to dump
189285242Sachim *              Count               - Amount to dump, in bytes
190285242Sachim *              Display             - BYTE, WORD, DWORD, or QWORD display:
191285242Sachim *                                      DB_BYTE_DISPLAY
192285242Sachim *                                      DB_WORD_DISPLAY
193285242Sachim *                                      DB_DWORD_DISPLAY
194285242Sachim *                                      DB_QWORD_DISPLAY
195285242Sachim *              ComponentID         - Caller's component ID
196285242Sachim *
197285242Sachim * RETURN:      None
198285242Sachim *
199285242Sachim * DESCRIPTION: Generic dump buffer in both hex and ascii.
200285242Sachim *
201285242Sachim ******************************************************************************/
202285242Sachim
203285242Sachimvoid
204285242SachimAcpiUtDebugDumpBuffer (
205285242Sachim    UINT8                   *Buffer,
206285242Sachim    UINT32                  Count,
207285242Sachim    UINT32                  Display,
208285242Sachim    UINT32                  ComponentId)
209285242Sachim{
210285242Sachim
211285242Sachim    /* Only dump the buffer if tracing is enabled */
212285242Sachim
213285242Sachim    if (!((ACPI_LV_TABLES & AcpiDbgLevel) &&
214285242Sachim        (ComponentId & AcpiDbgLayer)))
215285242Sachim    {
216285242Sachim        return;
217285242Sachim    }
218285242Sachim
219285242Sachim    AcpiUtDumpBuffer (Buffer, Count, Display, 0);
220285242Sachim}
221285242Sachim