1250757Sjkim/******************************************************************************
2250757Sjkim *
3250757Sjkim * Module Name: utbuffer - Buffer dump routines
4250757Sjkim *
5250757Sjkim *****************************************************************************/
6250757Sjkim
7250757Sjkim/*
8250757Sjkim * Copyright (C) 2000 - 2013, 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
44250757Sjkim#define __UTBUFFER_C__
45250757Sjkim
46250838Sjkim#include <contrib/dev/acpica/include/acpi.h>
47250838Sjkim#include <contrib/dev/acpica/include/accommon.h>
48250757Sjkim
49250757Sjkim#define _COMPONENT          ACPI_UTILITIES
50250757Sjkim        ACPI_MODULE_NAME    ("utbuffer")
51250757Sjkim
52250757Sjkim
53250757Sjkim/*******************************************************************************
54250757Sjkim *
55250757Sjkim * FUNCTION:    AcpiUtDumpBuffer
56250757Sjkim *
57250757Sjkim * PARAMETERS:  Buffer              - Buffer to dump
58250757Sjkim *              Count               - Amount to dump, in bytes
59250757Sjkim *              Display             - BYTE, WORD, DWORD, or QWORD display:
60250757Sjkim *                                      DB_BYTE_DISPLAY
61250757Sjkim *                                      DB_WORD_DISPLAY
62250757Sjkim *                                      DB_DWORD_DISPLAY
63250757Sjkim *                                      DB_QWORD_DISPLAY
64250757Sjkim *              BaseOffset          - Beginning buffer offset (display only)
65250757Sjkim *
66250757Sjkim * RETURN:      None
67250757Sjkim *
68250757Sjkim * DESCRIPTION: Generic dump buffer in both hex and ascii.
69250757Sjkim *
70250757Sjkim ******************************************************************************/
71250757Sjkim
72250757Sjkimvoid
73250757SjkimAcpiUtDumpBuffer (
74250757Sjkim    UINT8                   *Buffer,
75250757Sjkim    UINT32                  Count,
76250757Sjkim    UINT32                  Display,
77250757Sjkim    UINT32                  BaseOffset)
78250757Sjkim{
79250757Sjkim    UINT32                  i = 0;
80250757Sjkim    UINT32                  j;
81250757Sjkim    UINT32                  Temp32;
82250757Sjkim    UINT8                   BufChar;
83250757Sjkim
84250757Sjkim
85250757Sjkim    if (!Buffer)
86250757Sjkim    {
87250757Sjkim        AcpiOsPrintf ("Null Buffer Pointer in DumpBuffer!\n");
88250757Sjkim        return;
89250757Sjkim    }
90250757Sjkim
91250757Sjkim    if ((Count < 4) || (Count & 0x01))
92250757Sjkim    {
93250757Sjkim        Display = DB_BYTE_DISPLAY;
94250757Sjkim    }
95250757Sjkim
96250757Sjkim    /* Nasty little dump buffer routine! */
97250757Sjkim
98250757Sjkim    while (i < Count)
99250757Sjkim    {
100250757Sjkim        /* Print current offset */
101250757Sjkim
102250757Sjkim        AcpiOsPrintf ("%6.4X: ", (BaseOffset + i));
103250757Sjkim
104250757Sjkim        /* Print 16 hex chars */
105250757Sjkim
106250757Sjkim        for (j = 0; j < 16;)
107250757Sjkim        {
108250757Sjkim            if (i + j >= Count)
109250757Sjkim            {
110250757Sjkim                /* Dump fill spaces */
111250757Sjkim
112250757Sjkim                AcpiOsPrintf ("%*s", ((Display * 2) + 1), " ");
113250757Sjkim                j += Display;
114250757Sjkim                continue;
115250757Sjkim            }
116250757Sjkim
117250757Sjkim            switch (Display)
118250757Sjkim            {
119250757Sjkim            case DB_BYTE_DISPLAY:
120250757Sjkim            default:    /* Default is BYTE display */
121250757Sjkim
122250757Sjkim                AcpiOsPrintf ("%02X ", Buffer[(ACPI_SIZE) i + j]);
123250757Sjkim                break;
124250757Sjkim
125250757Sjkim            case DB_WORD_DISPLAY:
126250757Sjkim
127250757Sjkim                ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
128250757Sjkim                AcpiOsPrintf ("%04X ", Temp32);
129250757Sjkim                break;
130250757Sjkim
131250757Sjkim            case DB_DWORD_DISPLAY:
132250757Sjkim
133250757Sjkim                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
134250757Sjkim                AcpiOsPrintf ("%08X ", Temp32);
135250757Sjkim                break;
136250757Sjkim
137250757Sjkim            case DB_QWORD_DISPLAY:
138250757Sjkim
139250757Sjkim                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
140250757Sjkim                AcpiOsPrintf ("%08X", Temp32);
141250757Sjkim
142250757Sjkim                ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]);
143250757Sjkim                AcpiOsPrintf ("%08X ", Temp32);
144250757Sjkim                break;
145250757Sjkim            }
146250757Sjkim
147250757Sjkim            j += Display;
148250757Sjkim        }
149250757Sjkim
150250757Sjkim        /*
151250757Sjkim         * Print the ASCII equivalent characters but watch out for the bad
152250757Sjkim         * unprintable ones (printable chars are 0x20 through 0x7E)
153250757Sjkim         */
154250757Sjkim        AcpiOsPrintf (" ");
155250757Sjkim        for (j = 0; j < 16; j++)
156250757Sjkim        {
157250757Sjkim            if (i + j >= Count)
158250757Sjkim            {
159250757Sjkim                AcpiOsPrintf ("\n");
160250757Sjkim                return;
161250757Sjkim            }
162250757Sjkim
163250757Sjkim            BufChar = Buffer[(ACPI_SIZE) i + j];
164250757Sjkim            if (ACPI_IS_PRINT (BufChar))
165250757Sjkim            {
166250757Sjkim                AcpiOsPrintf ("%c", BufChar);
167250757Sjkim            }
168250757Sjkim            else
169250757Sjkim            {
170250757Sjkim                AcpiOsPrintf (".");
171250757Sjkim            }
172250757Sjkim        }
173250757Sjkim
174250757Sjkim        /* Done with that line. */
175250757Sjkim
176250757Sjkim        AcpiOsPrintf ("\n");
177250757Sjkim        i += 16;
178250757Sjkim    }
179250757Sjkim
180250757Sjkim    return;
181250757Sjkim}
182250757Sjkim
183250757Sjkim
184250757Sjkim/*******************************************************************************
185250757Sjkim *
186250757Sjkim * FUNCTION:    AcpiUtDebugDumpBuffer
187250757Sjkim *
188250757Sjkim * PARAMETERS:  Buffer              - Buffer to dump
189250757Sjkim *              Count               - Amount to dump, in bytes
190250757Sjkim *              Display             - BYTE, WORD, DWORD, or QWORD display:
191250757Sjkim *                                      DB_BYTE_DISPLAY
192250757Sjkim *                                      DB_WORD_DISPLAY
193250757Sjkim *                                      DB_DWORD_DISPLAY
194250757Sjkim *                                      DB_QWORD_DISPLAY
195250757Sjkim *              ComponentID         - Caller's component ID
196250757Sjkim *
197250757Sjkim * RETURN:      None
198250757Sjkim *
199250757Sjkim * DESCRIPTION: Generic dump buffer in both hex and ascii.
200250757Sjkim *
201250757Sjkim ******************************************************************************/
202250757Sjkim
203250757Sjkimvoid
204250757SjkimAcpiUtDebugDumpBuffer (
205250757Sjkim    UINT8                   *Buffer,
206250757Sjkim    UINT32                  Count,
207250757Sjkim    UINT32                  Display,
208250757Sjkim    UINT32                  ComponentId)
209250757Sjkim{
210250757Sjkim
211250757Sjkim    /* Only dump the buffer if tracing is enabled */
212250757Sjkim
213250757Sjkim    if (!((ACPI_LV_TABLES & AcpiDbgLevel) &&
214250757Sjkim        (ComponentId & AcpiDbgLayer)))
215250757Sjkim    {
216250757Sjkim        return;
217250757Sjkim    }
218250757Sjkim
219250757Sjkim    AcpiUtDumpBuffer (Buffer, Count, Display, 0);
220250757Sjkim}
221