xref: /netbsd-src/sys/external/bsd/acpica/dist/utilities/utbuffer.c (revision 046a29855e04359424fd074e8313af6b6be8cfb6)
1ff4a156dSchristos /******************************************************************************
2ff4a156dSchristos  *
3ff4a156dSchristos  * Module Name: utbuffer - Buffer dump routines
4ff4a156dSchristos  *
5ff4a156dSchristos  *****************************************************************************/
6ff4a156dSchristos 
7ff4a156dSchristos /*
8*046a2985Schristos  * Copyright (C) 2000 - 2023, Intel Corp.
9ff4a156dSchristos  * All rights reserved.
10ff4a156dSchristos  *
11ff4a156dSchristos  * Redistribution and use in source and binary forms, with or without
12ff4a156dSchristos  * modification, are permitted provided that the following conditions
13ff4a156dSchristos  * are met:
14ff4a156dSchristos  * 1. Redistributions of source code must retain the above copyright
15ff4a156dSchristos  *    notice, this list of conditions, and the following disclaimer,
16ff4a156dSchristos  *    without modification.
17ff4a156dSchristos  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18ff4a156dSchristos  *    substantially similar to the "NO WARRANTY" disclaimer below
19ff4a156dSchristos  *    ("Disclaimer") and any redistribution must be conditioned upon
20ff4a156dSchristos  *    including a substantially similar Disclaimer requirement for further
21ff4a156dSchristos  *    binary redistribution.
22ff4a156dSchristos  * 3. Neither the names of the above-listed copyright holders nor the names
23ff4a156dSchristos  *    of any contributors may be used to endorse or promote products derived
24ff4a156dSchristos  *    from this software without specific prior written permission.
25ff4a156dSchristos  *
26ff4a156dSchristos  * Alternatively, this software may be distributed under the terms of the
27ff4a156dSchristos  * GNU General Public License ("GPL") version 2 as published by the Free
28ff4a156dSchristos  * Software Foundation.
29ff4a156dSchristos  *
30ff4a156dSchristos  * NO WARRANTY
31ff4a156dSchristos  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32ff4a156dSchristos  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3346a330b4Schristos  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34ff4a156dSchristos  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35ff4a156dSchristos  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36ff4a156dSchristos  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37ff4a156dSchristos  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38ff4a156dSchristos  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39ff4a156dSchristos  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40ff4a156dSchristos  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41ff4a156dSchristos  * POSSIBILITY OF SUCH DAMAGES.
42ff4a156dSchristos  */
43ff4a156dSchristos 
44ff4a156dSchristos #include "acpi.h"
45ff4a156dSchristos #include "accommon.h"
46ff4a156dSchristos 
47ff4a156dSchristos #define _COMPONENT          ACPI_UTILITIES
48ff4a156dSchristos         ACPI_MODULE_NAME    ("utbuffer")
49ff4a156dSchristos 
50ff4a156dSchristos 
51ff4a156dSchristos /*******************************************************************************
52ff4a156dSchristos  *
53ff4a156dSchristos  * FUNCTION:    AcpiUtDumpBuffer
54ff4a156dSchristos  *
55ff4a156dSchristos  * PARAMETERS:  Buffer              - Buffer to dump
56ff4a156dSchristos  *              Count               - Amount to dump, in bytes
57ff4a156dSchristos  *              Display             - BYTE, WORD, DWORD, or QWORD display:
58ff4a156dSchristos  *                                      DB_BYTE_DISPLAY
59ff4a156dSchristos  *                                      DB_WORD_DISPLAY
60ff4a156dSchristos  *                                      DB_DWORD_DISPLAY
61ff4a156dSchristos  *                                      DB_QWORD_DISPLAY
62ff4a156dSchristos  *              BaseOffset          - Beginning buffer offset (display only)
63ff4a156dSchristos  *
64ff4a156dSchristos  * RETURN:      None
65ff4a156dSchristos  *
66ff4a156dSchristos  * DESCRIPTION: Generic dump buffer in both hex and ascii.
67ff4a156dSchristos  *
68ff4a156dSchristos  ******************************************************************************/
69ff4a156dSchristos 
70ff4a156dSchristos void
AcpiUtDumpBuffer(UINT8 * Buffer,UINT32 Count,UINT32 Display,UINT32 BaseOffset)71ff4a156dSchristos AcpiUtDumpBuffer (
72ff4a156dSchristos     UINT8                   *Buffer,
73ff4a156dSchristos     UINT32                  Count,
74ff4a156dSchristos     UINT32                  Display,
75ff4a156dSchristos     UINT32                  BaseOffset)
76ff4a156dSchristos {
77ff4a156dSchristos     UINT32                  i = 0;
78ff4a156dSchristos     UINT32                  j;
79ff4a156dSchristos     UINT32                  Temp32;
80ff4a156dSchristos     UINT8                   BufChar;
8132aedd46Schristos     UINT32                  DisplayDataOnly = Display & DB_DISPLAY_DATA_ONLY;
82ff4a156dSchristos 
83ff4a156dSchristos 
8432aedd46Schristos     Display &= ~DB_DISPLAY_DATA_ONLY;
85ff4a156dSchristos     if (!Buffer)
86ff4a156dSchristos     {
87ff4a156dSchristos         AcpiOsPrintf ("Null Buffer Pointer in DumpBuffer!\n");
88ff4a156dSchristos         return;
89ff4a156dSchristos     }
90ff4a156dSchristos 
91ff4a156dSchristos     if ((Count < 4) || (Count & 0x01))
92ff4a156dSchristos     {
93ff4a156dSchristos         Display = DB_BYTE_DISPLAY;
94ff4a156dSchristos     }
95ff4a156dSchristos 
96ff4a156dSchristos     /* Nasty little dump buffer routine! */
97ff4a156dSchristos 
98ff4a156dSchristos     while (i < Count)
99ff4a156dSchristos     {
100ff4a156dSchristos         /* Print current offset */
101ff4a156dSchristos 
10232aedd46Schristos         if (!DisplayDataOnly)
10332aedd46Schristos         {
10447315524Schristos             AcpiOsPrintf ("%8.4X: ", (BaseOffset + i));
10532aedd46Schristos         }
106ff4a156dSchristos 
107ff4a156dSchristos         /* Print 16 hex chars */
108ff4a156dSchristos 
109ff4a156dSchristos         for (j = 0; j < 16;)
110ff4a156dSchristos         {
111ff4a156dSchristos             if (i + j >= Count)
112ff4a156dSchristos             {
113ff4a156dSchristos                 /* Dump fill spaces */
114ff4a156dSchristos 
115ff4a156dSchristos                 AcpiOsPrintf ("%*s", ((Display * 2) + 1), " ");
116ff4a156dSchristos                 j += Display;
117ff4a156dSchristos                 continue;
118ff4a156dSchristos             }
119ff4a156dSchristos 
120ff4a156dSchristos             switch (Display)
121ff4a156dSchristos             {
122ff4a156dSchristos             case DB_BYTE_DISPLAY:
123ff4a156dSchristos             default:    /* Default is BYTE display */
124ff4a156dSchristos 
125ff4a156dSchristos                 AcpiOsPrintf ("%02X ", Buffer[(ACPI_SIZE) i + j]);
126ff4a156dSchristos                 break;
127ff4a156dSchristos 
128ff4a156dSchristos             case DB_WORD_DISPLAY:
129ff4a156dSchristos 
130ff4a156dSchristos                 ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
131ff4a156dSchristos                 AcpiOsPrintf ("%04X ", Temp32);
132ff4a156dSchristos                 break;
133ff4a156dSchristos 
134ff4a156dSchristos             case DB_DWORD_DISPLAY:
135ff4a156dSchristos 
136ff4a156dSchristos                 ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
137ff4a156dSchristos                 AcpiOsPrintf ("%08X ", Temp32);
138ff4a156dSchristos                 break;
139ff4a156dSchristos 
140ff4a156dSchristos             case DB_QWORD_DISPLAY:
141ff4a156dSchristos 
142ff4a156dSchristos                 ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
143ff4a156dSchristos                 AcpiOsPrintf ("%08X", Temp32);
144ff4a156dSchristos 
145ff4a156dSchristos                 ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]);
146ff4a156dSchristos                 AcpiOsPrintf ("%08X ", Temp32);
147ff4a156dSchristos                 break;
148ff4a156dSchristos             }
149ff4a156dSchristos 
150ff4a156dSchristos             j += Display;
151ff4a156dSchristos         }
152ff4a156dSchristos 
153ff4a156dSchristos         /*
154ff4a156dSchristos          * Print the ASCII equivalent characters but watch out for the bad
155ff4a156dSchristos          * unprintable ones (printable chars are 0x20 through 0x7E)
156ff4a156dSchristos          */
15732aedd46Schristos         if (!DisplayDataOnly)
15832aedd46Schristos         {
159ff4a156dSchristos             AcpiOsPrintf (" ");
160ff4a156dSchristos             for (j = 0; j < 16; j++)
161ff4a156dSchristos             {
162ff4a156dSchristos                 if (i + j >= Count)
163ff4a156dSchristos                 {
164ff4a156dSchristos                     AcpiOsPrintf ("\n");
165ff4a156dSchristos                     return;
166ff4a156dSchristos                 }
167ff4a156dSchristos 
168679c17fdSchristos                 /*
169679c17fdSchristos                  * Add comment characters so rest of line is ignored when
170679c17fdSchristos                  * compiled
171679c17fdSchristos                  */
172679c17fdSchristos                 if (j == 0)
173679c17fdSchristos                 {
174679c17fdSchristos                     AcpiOsPrintf ("// ");
175679c17fdSchristos                 }
176679c17fdSchristos 
177ff4a156dSchristos                 BufChar = Buffer[(ACPI_SIZE) i + j];
178c72da027Schristos                 if (isprint (BufChar))
179ff4a156dSchristos                 {
180ff4a156dSchristos                     AcpiOsPrintf ("%c", BufChar);
181ff4a156dSchristos                 }
182ff4a156dSchristos                 else
183ff4a156dSchristos                 {
184ff4a156dSchristos                     AcpiOsPrintf (".");
185ff4a156dSchristos                 }
186ff4a156dSchristos             }
187ff4a156dSchristos 
188ff4a156dSchristos             /* Done with that line. */
189ff4a156dSchristos 
190ff4a156dSchristos             AcpiOsPrintf ("\n");
19132aedd46Schristos         }
192ff4a156dSchristos         i += 16;
193ff4a156dSchristos     }
194ff4a156dSchristos 
195ff4a156dSchristos     return;
196ff4a156dSchristos }
197ff4a156dSchristos 
198ff4a156dSchristos 
199ff4a156dSchristos /*******************************************************************************
200ff4a156dSchristos  *
201ff4a156dSchristos  * FUNCTION:    AcpiUtDebugDumpBuffer
202ff4a156dSchristos  *
203ff4a156dSchristos  * PARAMETERS:  Buffer              - Buffer to dump
204ff4a156dSchristos  *              Count               - Amount to dump, in bytes
205ff4a156dSchristos  *              Display             - BYTE, WORD, DWORD, or QWORD display:
206ff4a156dSchristos  *                                      DB_BYTE_DISPLAY
207ff4a156dSchristos  *                                      DB_WORD_DISPLAY
208ff4a156dSchristos  *                                      DB_DWORD_DISPLAY
209ff4a156dSchristos  *                                      DB_QWORD_DISPLAY
210ff4a156dSchristos  *              ComponentID         - Caller's component ID
211ff4a156dSchristos  *
212ff4a156dSchristos  * RETURN:      None
213ff4a156dSchristos  *
214ff4a156dSchristos  * DESCRIPTION: Generic dump buffer in both hex and ascii.
215ff4a156dSchristos  *
216ff4a156dSchristos  ******************************************************************************/
217ff4a156dSchristos 
218ff4a156dSchristos void
AcpiUtDebugDumpBuffer(UINT8 * Buffer,UINT32 Count,UINT32 Display,UINT32 ComponentId)219ff4a156dSchristos AcpiUtDebugDumpBuffer (
220ff4a156dSchristos     UINT8                   *Buffer,
221ff4a156dSchristos     UINT32                  Count,
222ff4a156dSchristos     UINT32                  Display,
223ff4a156dSchristos     UINT32                  ComponentId)
224ff4a156dSchristos {
225ff4a156dSchristos 
226ff4a156dSchristos     /* Only dump the buffer if tracing is enabled */
227ff4a156dSchristos 
228ff4a156dSchristos     if (!((ACPI_LV_TABLES & AcpiDbgLevel) &&
229ff4a156dSchristos         (ComponentId & AcpiDbgLayer)))
230ff4a156dSchristos     {
231ff4a156dSchristos         return;
232ff4a156dSchristos     }
233ff4a156dSchristos 
234ff4a156dSchristos     AcpiUtDumpBuffer (Buffer, Count, Display, 0);
235ff4a156dSchristos }
236460301d4Schristos 
237460301d4Schristos 
238460301d4Schristos #ifdef ACPI_APPLICATION
239460301d4Schristos /*******************************************************************************
240460301d4Schristos  *
241460301d4Schristos  * FUNCTION:    AcpiUtDumpBufferToFile
242460301d4Schristos  *
243460301d4Schristos  * PARAMETERS:  File                - File descriptor
244460301d4Schristos  *              Buffer              - Buffer to dump
245460301d4Schristos  *              Count               - Amount to dump, in bytes
246460301d4Schristos  *              Display             - BYTE, WORD, DWORD, or QWORD display:
247460301d4Schristos  *                                      DB_BYTE_DISPLAY
248460301d4Schristos  *                                      DB_WORD_DISPLAY
249460301d4Schristos  *                                      DB_DWORD_DISPLAY
250460301d4Schristos  *                                      DB_QWORD_DISPLAY
251460301d4Schristos  *              BaseOffset          - Beginning buffer offset (display only)
252460301d4Schristos  *
253460301d4Schristos  * RETURN:      None
254460301d4Schristos  *
255460301d4Schristos  * DESCRIPTION: Generic dump buffer in both hex and ascii to a file.
256460301d4Schristos  *
257460301d4Schristos  ******************************************************************************/
258460301d4Schristos 
259460301d4Schristos void
AcpiUtDumpBufferToFile(ACPI_FILE File,UINT8 * Buffer,UINT32 Count,UINT32 Display,UINT32 BaseOffset)260460301d4Schristos AcpiUtDumpBufferToFile (
261460301d4Schristos     ACPI_FILE               File,
262460301d4Schristos     UINT8                   *Buffer,
263460301d4Schristos     UINT32                  Count,
264460301d4Schristos     UINT32                  Display,
265460301d4Schristos     UINT32                  BaseOffset)
266460301d4Schristos {
267460301d4Schristos     UINT32                  i = 0;
268460301d4Schristos     UINT32                  j;
269460301d4Schristos     UINT32                  Temp32;
270460301d4Schristos     UINT8                   BufChar;
271460301d4Schristos 
272460301d4Schristos 
273460301d4Schristos     if (!Buffer)
274460301d4Schristos     {
275d0e1da26Schristos         fprintf (File, "Null Buffer Pointer in DumpBuffer!\n");
276460301d4Schristos         return;
277460301d4Schristos     }
278460301d4Schristos 
279460301d4Schristos     if ((Count < 4) || (Count & 0x01))
280460301d4Schristos     {
281460301d4Schristos         Display = DB_BYTE_DISPLAY;
282460301d4Schristos     }
283460301d4Schristos 
284460301d4Schristos     /* Nasty little dump buffer routine! */
285460301d4Schristos 
286460301d4Schristos     while (i < Count)
287460301d4Schristos     {
288460301d4Schristos         /* Print current offset */
289460301d4Schristos 
29047315524Schristos         fprintf (File, "%8.4X: ", (BaseOffset + i));
291460301d4Schristos 
292460301d4Schristos         /* Print 16 hex chars */
293460301d4Schristos 
294460301d4Schristos         for (j = 0; j < 16;)
295460301d4Schristos         {
296460301d4Schristos             if (i + j >= Count)
297460301d4Schristos             {
298460301d4Schristos                 /* Dump fill spaces */
299460301d4Schristos 
300d0e1da26Schristos                 fprintf (File, "%*s", ((Display * 2) + 1), " ");
301460301d4Schristos                 j += Display;
302460301d4Schristos                 continue;
303460301d4Schristos             }
304460301d4Schristos 
305460301d4Schristos             switch (Display)
306460301d4Schristos             {
307460301d4Schristos             case DB_BYTE_DISPLAY:
308460301d4Schristos             default:    /* Default is BYTE display */
309460301d4Schristos 
310d0e1da26Schristos                 fprintf (File, "%02X ", Buffer[(ACPI_SIZE) i + j]);
311460301d4Schristos                 break;
312460301d4Schristos 
313460301d4Schristos             case DB_WORD_DISPLAY:
314460301d4Schristos 
315460301d4Schristos                 ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
316d0e1da26Schristos                 fprintf (File, "%04X ", Temp32);
317460301d4Schristos                 break;
318460301d4Schristos 
319460301d4Schristos             case DB_DWORD_DISPLAY:
320460301d4Schristos 
321460301d4Schristos                 ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
322d0e1da26Schristos                 fprintf (File, "%08X ", Temp32);
323460301d4Schristos                 break;
324460301d4Schristos 
325460301d4Schristos             case DB_QWORD_DISPLAY:
326460301d4Schristos 
327460301d4Schristos                 ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j]);
328d0e1da26Schristos                 fprintf (File, "%08X", Temp32);
329460301d4Schristos 
330460301d4Schristos                 ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[(ACPI_SIZE) i + j + 4]);
331d0e1da26Schristos                 fprintf (File, "%08X ", Temp32);
332460301d4Schristos                 break;
333460301d4Schristos             }
334460301d4Schristos 
335460301d4Schristos             j += Display;
336460301d4Schristos         }
337460301d4Schristos 
338460301d4Schristos         /*
339460301d4Schristos          * Print the ASCII equivalent characters but watch out for the bad
340460301d4Schristos          * unprintable ones (printable chars are 0x20 through 0x7E)
341460301d4Schristos          */
342d0e1da26Schristos         fprintf (File, " ");
343460301d4Schristos         for (j = 0; j < 16; j++)
344460301d4Schristos         {
345460301d4Schristos             if (i + j >= Count)
346460301d4Schristos             {
347d0e1da26Schristos                 fprintf (File, "\n");
348460301d4Schristos                 return;
349460301d4Schristos             }
350460301d4Schristos 
351460301d4Schristos             BufChar = Buffer[(ACPI_SIZE) i + j];
352c72da027Schristos             if (isprint (BufChar))
353460301d4Schristos             {
354d0e1da26Schristos                 fprintf (File, "%c", BufChar);
355460301d4Schristos             }
356460301d4Schristos             else
357460301d4Schristos             {
358d0e1da26Schristos                 fprintf (File, ".");
359460301d4Schristos             }
360460301d4Schristos         }
361460301d4Schristos 
362460301d4Schristos         /* Done with that line. */
363460301d4Schristos 
364d0e1da26Schristos         fprintf (File, "\n");
365460301d4Schristos         i += 16;
366460301d4Schristos     }
367460301d4Schristos 
368460301d4Schristos     return;
369460301d4Schristos }
370460301d4Schristos #endif
371