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