xref: /openbmc/linux/drivers/acpi/acpica/utbuffer.c (revision b34e08d5)
1 /******************************************************************************
2  *
3  * Module Name: utbuffer - Buffer dump routines
4  *
5  *****************************************************************************/
6 
7 /*
8  * Copyright (C) 2000 - 2014, Intel Corp.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions, and the following disclaimer,
16  *    without modification.
17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18  *    substantially similar to the "NO WARRANTY" disclaimer below
19  *    ("Disclaimer") and any redistribution must be conditioned upon
20  *    including a substantially similar Disclaimer requirement for further
21  *    binary redistribution.
22  * 3. Neither the names of the above-listed copyright holders nor the names
23  *    of any contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * Alternatively, this software may be distributed under the terms of the
27  * GNU General Public License ("GPL") version 2 as published by the Free
28  * Software Foundation.
29  *
30  * NO WARRANTY
31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41  * POSSIBILITY OF SUCH DAMAGES.
42  */
43 
44 #include <acpi/acpi.h>
45 #include "accommon.h"
46 
47 #define _COMPONENT          ACPI_UTILITIES
48 ACPI_MODULE_NAME("utbuffer")
49 
50 /*******************************************************************************
51  *
52  * FUNCTION:    acpi_ut_dump_buffer
53  *
54  * PARAMETERS:  buffer              - Buffer to dump
55  *              count               - Amount to dump, in bytes
56  *              display             - BYTE, WORD, DWORD, or QWORD display:
57  *                                      DB_BYTE_DISPLAY
58  *                                      DB_WORD_DISPLAY
59  *                                      DB_DWORD_DISPLAY
60  *                                      DB_QWORD_DISPLAY
61  *              base_offset         - Beginning buffer offset (display only)
62  *
63  * RETURN:      None
64  *
65  * DESCRIPTION: Generic dump buffer in both hex and ascii.
66  *
67  ******************************************************************************/
68 void acpi_ut_dump_buffer(u8 *buffer, u32 count, u32 display, u32 base_offset)
69 {
70 	u32 i = 0;
71 	u32 j;
72 	u32 temp32;
73 	u8 buf_char;
74 
75 	if (!buffer) {
76 		acpi_os_printf("Null Buffer Pointer in DumpBuffer!\n");
77 		return;
78 	}
79 
80 	if ((count < 4) || (count & 0x01)) {
81 		display = DB_BYTE_DISPLAY;
82 	}
83 
84 	/* Nasty little dump buffer routine! */
85 
86 	while (i < count) {
87 
88 		/* Print current offset */
89 
90 		acpi_os_printf("%6.4X: ", (base_offset + i));
91 
92 		/* Print 16 hex chars */
93 
94 		for (j = 0; j < 16;) {
95 			if (i + j >= count) {
96 
97 				/* Dump fill spaces */
98 
99 				acpi_os_printf("%*s", ((display * 2) + 1), " ");
100 				j += display;
101 				continue;
102 			}
103 
104 			switch (display) {
105 			case DB_BYTE_DISPLAY:
106 			default:	/* Default is BYTE display */
107 
108 				acpi_os_printf("%02X ",
109 					       buffer[(acpi_size) i + j]);
110 				break;
111 
112 			case DB_WORD_DISPLAY:
113 
114 				ACPI_MOVE_16_TO_32(&temp32,
115 						   &buffer[(acpi_size) i + j]);
116 				acpi_os_printf("%04X ", temp32);
117 				break;
118 
119 			case DB_DWORD_DISPLAY:
120 
121 				ACPI_MOVE_32_TO_32(&temp32,
122 						   &buffer[(acpi_size) i + j]);
123 				acpi_os_printf("%08X ", temp32);
124 				break;
125 
126 			case DB_QWORD_DISPLAY:
127 
128 				ACPI_MOVE_32_TO_32(&temp32,
129 						   &buffer[(acpi_size) i + j]);
130 				acpi_os_printf("%08X", temp32);
131 
132 				ACPI_MOVE_32_TO_32(&temp32,
133 						   &buffer[(acpi_size) i + j +
134 							   4]);
135 				acpi_os_printf("%08X ", temp32);
136 				break;
137 			}
138 
139 			j += display;
140 		}
141 
142 		/*
143 		 * Print the ASCII equivalent characters but watch out for the bad
144 		 * unprintable ones (printable chars are 0x20 through 0x7E)
145 		 */
146 		acpi_os_printf(" ");
147 		for (j = 0; j < 16; j++) {
148 			if (i + j >= count) {
149 				acpi_os_printf("\n");
150 				return;
151 			}
152 
153 			buf_char = buffer[(acpi_size) i + j];
154 			if (ACPI_IS_PRINT(buf_char)) {
155 				acpi_os_printf("%c", buf_char);
156 			} else {
157 				acpi_os_printf(".");
158 			}
159 		}
160 
161 		/* Done with that line. */
162 
163 		acpi_os_printf("\n");
164 		i += 16;
165 	}
166 
167 	return;
168 }
169 
170 /*******************************************************************************
171  *
172  * FUNCTION:    acpi_ut_debug_dump_buffer
173  *
174  * PARAMETERS:  buffer              - Buffer to dump
175  *              count               - Amount to dump, in bytes
176  *              display             - BYTE, WORD, DWORD, or QWORD display:
177  *                                      DB_BYTE_DISPLAY
178  *                                      DB_WORD_DISPLAY
179  *                                      DB_DWORD_DISPLAY
180  *                                      DB_QWORD_DISPLAY
181  *              component_ID        - Caller's component ID
182  *
183  * RETURN:      None
184  *
185  * DESCRIPTION: Generic dump buffer in both hex and ascii.
186  *
187  ******************************************************************************/
188 
189 void
190 acpi_ut_debug_dump_buffer(u8 *buffer, u32 count, u32 display, u32 component_id)
191 {
192 
193 	/* Only dump the buffer if tracing is enabled */
194 
195 	if (!((ACPI_LV_TABLES & acpi_dbg_level) &&
196 	      (component_id & acpi_dbg_layer))) {
197 		return;
198 	}
199 
200 	acpi_ut_dump_buffer(buffer, count, display, 0);
201 }
202