1 | /****************************************************************************** |
2 | * |
3 | * Module Name: tbprint - Table output utilities |
4 | * |
5 | *****************************************************************************/ |
6 | |
7 | /* |
8 | * Copyright (C) 2000 - 2016, 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.h" |
45 | #include "accommon.h" |
46 | #include "actables.h" |
47 | |
48 | #define _COMPONENT ACPI_TABLES |
49 | ACPI_MODULE_NAME ("tbprint" ) |
50 | |
51 | |
52 | /* Local prototypes */ |
53 | |
54 | static void |
55 | AcpiTbFixString ( |
56 | char *String, |
57 | ACPI_SIZE Length); |
58 | |
59 | static void |
60 | AcpiTbCleanupTableHeader ( |
61 | ACPI_TABLE_HEADER *, |
62 | ACPI_TABLE_HEADER *); |
63 | |
64 | |
65 | /******************************************************************************* |
66 | * |
67 | * FUNCTION: AcpiTbFixString |
68 | * |
69 | * PARAMETERS: String - String to be repaired |
70 | * Length - Maximum length |
71 | * |
72 | * RETURN: None |
73 | * |
74 | * DESCRIPTION: Replace every non-printable or non-ascii byte in the string |
75 | * with a question mark '?'. |
76 | * |
77 | ******************************************************************************/ |
78 | |
79 | static void |
80 | AcpiTbFixString ( |
81 | char *String, |
82 | ACPI_SIZE Length) |
83 | { |
84 | |
85 | while (Length && *String) |
86 | { |
87 | if (!isprint ((int) *String)) |
88 | { |
89 | *String = '?'; |
90 | } |
91 | |
92 | String++; |
93 | Length--; |
94 | } |
95 | } |
96 | |
97 | |
98 | /******************************************************************************* |
99 | * |
100 | * FUNCTION: AcpiTbCleanupTableHeader |
101 | * |
102 | * PARAMETERS: OutHeader - Where the cleaned header is returned |
103 | * Header - Input ACPI table header |
104 | * |
105 | * RETURN: Returns the cleaned header in OutHeader |
106 | * |
107 | * DESCRIPTION: Copy the table header and ensure that all "string" fields in |
108 | * the header consist of printable characters. |
109 | * |
110 | ******************************************************************************/ |
111 | |
112 | static void |
113 | ( |
114 | ACPI_TABLE_HEADER *, |
115 | ACPI_TABLE_HEADER *) |
116 | { |
117 | |
118 | memcpy (OutHeader, Header, sizeof (ACPI_TABLE_HEADER)); |
119 | |
120 | AcpiTbFixString (OutHeader->Signature, ACPI_NAME_SIZE); |
121 | AcpiTbFixString (OutHeader->OemId, ACPI_OEM_ID_SIZE); |
122 | AcpiTbFixString (OutHeader->OemTableId, ACPI_OEM_TABLE_ID_SIZE); |
123 | AcpiTbFixString (OutHeader->AslCompilerId, ACPI_NAME_SIZE); |
124 | } |
125 | |
126 | |
127 | /******************************************************************************* |
128 | * |
129 | * FUNCTION: AcpiTbPrintTableHeader |
130 | * |
131 | * PARAMETERS: Address - Table physical address |
132 | * Header - Table header |
133 | * |
134 | * RETURN: None |
135 | * |
136 | * DESCRIPTION: Print an ACPI table header. Special cases for FACS and RSDP. |
137 | * |
138 | ******************************************************************************/ |
139 | |
140 | void |
141 | ( |
142 | ACPI_PHYSICAL_ADDRESS Address, |
143 | ACPI_TABLE_HEADER *) |
144 | { |
145 | ACPI_TABLE_HEADER ; |
146 | |
147 | |
148 | if (ACPI_COMPARE_NAME (Header->Signature, ACPI_SIG_FACS)) |
149 | { |
150 | /* FACS only has signature and length fields */ |
151 | |
152 | ACPI_INFO (("%-4.4s 0x%8.8X%8.8X %06X" , |
153 | Header->Signature, ACPI_FORMAT_UINT64 (Address), |
154 | Header->Length)); |
155 | } |
156 | else if (ACPI_VALIDATE_RSDP_SIG (Header->Signature)) |
157 | { |
158 | /* RSDP has no common fields */ |
159 | |
160 | memcpy (LocalHeader.OemId, ACPI_CAST_PTR (ACPI_TABLE_RSDP, |
161 | Header)->OemId, ACPI_OEM_ID_SIZE); |
162 | AcpiTbFixString (LocalHeader.OemId, ACPI_OEM_ID_SIZE); |
163 | |
164 | ACPI_INFO (("RSDP 0x%8.8X%8.8X %06X (v%.2d %-6.6s)" , |
165 | ACPI_FORMAT_UINT64 (Address), |
166 | (ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision > 0) ? |
167 | ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Length : 20, |
168 | ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision, |
169 | LocalHeader.OemId)); |
170 | } |
171 | else |
172 | { |
173 | /* Standard ACPI table with full common header */ |
174 | |
175 | AcpiTbCleanupTableHeader (&LocalHeader, Header); |
176 | |
177 | ACPI_INFO (( |
178 | "%-4.4s 0x%8.8X%8.8X" |
179 | " %06X (v%.2d %-6.6s %-8.8s %08X %-4.4s %08X)" , |
180 | LocalHeader.Signature, ACPI_FORMAT_UINT64 (Address), |
181 | LocalHeader.Length, LocalHeader.Revision, LocalHeader.OemId, |
182 | LocalHeader.OemTableId, LocalHeader.OemRevision, |
183 | LocalHeader.AslCompilerId, LocalHeader.AslCompilerRevision)); |
184 | } |
185 | } |
186 | |
187 | |
188 | /******************************************************************************* |
189 | * |
190 | * FUNCTION: AcpiTbValidateChecksum |
191 | * |
192 | * PARAMETERS: Table - ACPI table to verify |
193 | * Length - Length of entire table |
194 | * |
195 | * RETURN: Status |
196 | * |
197 | * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns |
198 | * exception on bad checksum. |
199 | * |
200 | ******************************************************************************/ |
201 | |
202 | ACPI_STATUS |
203 | AcpiTbVerifyChecksum ( |
204 | ACPI_TABLE_HEADER *Table, |
205 | UINT32 Length) |
206 | { |
207 | UINT8 Checksum; |
208 | |
209 | |
210 | /* |
211 | * FACS/S3PT: |
212 | * They are the odd tables, have no standard ACPI header and no checksum |
213 | */ |
214 | |
215 | if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_S3PT) || |
216 | ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS)) |
217 | { |
218 | return (AE_OK); |
219 | } |
220 | |
221 | /* Compute the checksum on the table */ |
222 | |
223 | Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Length); |
224 | |
225 | /* Checksum ok? (should be zero) */ |
226 | |
227 | if (Checksum) |
228 | { |
229 | ACPI_BIOS_WARNING ((AE_INFO, |
230 | "Incorrect checksum in table [%4.4s] - 0x%2.2X, " |
231 | "should be 0x%2.2X" , |
232 | Table->Signature, Table->Checksum, |
233 | (UINT8) (Table->Checksum - Checksum))); |
234 | |
235 | #if (ACPI_CHECKSUM_ABORT) |
236 | return (AE_BAD_CHECKSUM); |
237 | #endif |
238 | } |
239 | |
240 | return (AE_OK); |
241 | } |
242 | |
243 | |
244 | /******************************************************************************* |
245 | * |
246 | * FUNCTION: AcpiTbChecksum |
247 | * |
248 | * PARAMETERS: Buffer - Pointer to memory region to be checked |
249 | * Length - Length of this memory region |
250 | * |
251 | * RETURN: Checksum (UINT8) |
252 | * |
253 | * DESCRIPTION: Calculates circular checksum of memory region. |
254 | * |
255 | ******************************************************************************/ |
256 | |
257 | UINT8 |
258 | AcpiTbChecksum ( |
259 | UINT8 *Buffer, |
260 | UINT32 Length) |
261 | { |
262 | UINT8 Sum = 0; |
263 | UINT8 *End = Buffer + Length; |
264 | |
265 | |
266 | while (Buffer < End) |
267 | { |
268 | Sum = (UINT8) (Sum + *(Buffer++)); |
269 | } |
270 | |
271 | return (Sum); |
272 | } |
273 | |