dmtable.c revision 1.1.1.2 1 1.1 jruoho /******************************************************************************
2 1.1 jruoho *
3 1.1 jruoho * Module Name: dmtable - Support for ACPI tables that contain no AML code
4 1.1 jruoho *
5 1.1 jruoho *****************************************************************************/
6 1.1 jruoho
7 1.1.1.2 jruoho /*
8 1.1.1.2 jruoho * Copyright (C) 2000 - 2011, Intel Corp.
9 1.1 jruoho * All rights reserved.
10 1.1 jruoho *
11 1.1.1.2 jruoho * Redistribution and use in source and binary forms, with or without
12 1.1.1.2 jruoho * modification, are permitted provided that the following conditions
13 1.1.1.2 jruoho * are met:
14 1.1.1.2 jruoho * 1. Redistributions of source code must retain the above copyright
15 1.1.1.2 jruoho * notice, this list of conditions, and the following disclaimer,
16 1.1.1.2 jruoho * without modification.
17 1.1.1.2 jruoho * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 1.1.1.2 jruoho * substantially similar to the "NO WARRANTY" disclaimer below
19 1.1.1.2 jruoho * ("Disclaimer") and any redistribution must be conditioned upon
20 1.1.1.2 jruoho * including a substantially similar Disclaimer requirement for further
21 1.1.1.2 jruoho * binary redistribution.
22 1.1.1.2 jruoho * 3. Neither the names of the above-listed copyright holders nor the names
23 1.1.1.2 jruoho * of any contributors may be used to endorse or promote products derived
24 1.1.1.2 jruoho * from this software without specific prior written permission.
25 1.1.1.2 jruoho *
26 1.1.1.2 jruoho * Alternatively, this software may be distributed under the terms of the
27 1.1.1.2 jruoho * GNU General Public License ("GPL") version 2 as published by the Free
28 1.1.1.2 jruoho * Software Foundation.
29 1.1.1.2 jruoho *
30 1.1.1.2 jruoho * NO WARRANTY
31 1.1.1.2 jruoho * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 1.1.1.2 jruoho * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 1.1.1.2 jruoho * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 1.1.1.2 jruoho * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 1.1.1.2 jruoho * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 1.1.1.2 jruoho * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 1.1.1.2 jruoho * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 1.1.1.2 jruoho * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 1.1.1.2 jruoho * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 1.1.1.2 jruoho * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 1.1.1.2 jruoho * POSSIBILITY OF SUCH DAMAGES.
42 1.1.1.2 jruoho */
43 1.1 jruoho
44 1.1 jruoho #include "acpi.h"
45 1.1 jruoho #include "accommon.h"
46 1.1 jruoho #include "acdisasm.h"
47 1.1 jruoho #include "actables.h"
48 1.1.1.2 jruoho #include "aslcompiler.h"
49 1.1 jruoho #include "dtcompiler.h"
50 1.1 jruoho
51 1.1 jruoho /* This module used for application-level code only */
52 1.1 jruoho
53 1.1 jruoho #define _COMPONENT ACPI_CA_DISASSEMBLER
54 1.1 jruoho ACPI_MODULE_NAME ("dmtable")
55 1.1 jruoho
56 1.1 jruoho /* Local Prototypes */
57 1.1 jruoho
58 1.1 jruoho static void
59 1.1 jruoho AcpiDmCheckAscii (
60 1.1 jruoho UINT8 *Target,
61 1.1 jruoho char *RepairedName,
62 1.1 jruoho UINT32 Count);
63 1.1 jruoho
64 1.1 jruoho
65 1.1 jruoho /* These tables map a subtable type to a description string */
66 1.1 jruoho
67 1.1 jruoho static const char *AcpiDmAsfSubnames[] =
68 1.1 jruoho {
69 1.1 jruoho "ASF Information",
70 1.1 jruoho "ASF Alerts",
71 1.1 jruoho "ASF Remote Control",
72 1.1 jruoho "ASF RMCP Boot Options",
73 1.1 jruoho "ASF Address",
74 1.1 jruoho "Unknown SubTable Type" /* Reserved */
75 1.1 jruoho };
76 1.1 jruoho
77 1.1 jruoho static const char *AcpiDmDmarSubnames[] =
78 1.1 jruoho {
79 1.1 jruoho "Hardware Unit Definition",
80 1.1 jruoho "Reserved Memory Region",
81 1.1 jruoho "Root Port ATS Capability",
82 1.1 jruoho "Remapping Hardware Static Affinity",
83 1.1 jruoho "Unknown SubTable Type" /* Reserved */
84 1.1 jruoho };
85 1.1 jruoho
86 1.1.1.2 jruoho static const char *AcpiDmEinjActions[] =
87 1.1.1.2 jruoho {
88 1.1.1.2 jruoho "Begin Operation",
89 1.1.1.2 jruoho "Get Trigger Table",
90 1.1.1.2 jruoho "Set Error Type",
91 1.1.1.2 jruoho "Get Error Type",
92 1.1.1.2 jruoho "End Operation",
93 1.1.1.2 jruoho "Execute Operation",
94 1.1.1.2 jruoho "Check Busy Status",
95 1.1.1.2 jruoho "Get Command Status",
96 1.1.1.2 jruoho "Unknown Action"
97 1.1.1.2 jruoho };
98 1.1.1.2 jruoho
99 1.1.1.2 jruoho static const char *AcpiDmEinjInstructions[] =
100 1.1.1.2 jruoho {
101 1.1.1.2 jruoho "Read Register",
102 1.1.1.2 jruoho "Read Register Value",
103 1.1.1.2 jruoho "Write Register",
104 1.1.1.2 jruoho "Write Register Value",
105 1.1.1.2 jruoho "Noop",
106 1.1.1.2 jruoho "Unknown Instruction"
107 1.1.1.2 jruoho };
108 1.1.1.2 jruoho
109 1.1.1.2 jruoho static const char *AcpiDmErstActions[] =
110 1.1.1.2 jruoho {
111 1.1.1.2 jruoho "Begin Write Operation",
112 1.1.1.2 jruoho "Begin Read Operation",
113 1.1.1.2 jruoho "Begin Clear Operation",
114 1.1.1.2 jruoho "End Operation",
115 1.1.1.2 jruoho "Set Record Offset",
116 1.1.1.2 jruoho "Execute Operation",
117 1.1.1.2 jruoho "Check Busy Status",
118 1.1.1.2 jruoho "Get Command Status",
119 1.1.1.2 jruoho "Get Record Identifier",
120 1.1.1.2 jruoho "Set Record Identifier",
121 1.1.1.2 jruoho "Get Record Count",
122 1.1.1.2 jruoho "Begin Dummy Write",
123 1.1.1.2 jruoho "Unused/Unknown Action",
124 1.1.1.2 jruoho "Get Error Address Range",
125 1.1.1.2 jruoho "Get Error Address Length",
126 1.1.1.2 jruoho "Get Error Attributes",
127 1.1.1.2 jruoho "Unknown Action"
128 1.1.1.2 jruoho };
129 1.1.1.2 jruoho
130 1.1.1.2 jruoho static const char *AcpiDmErstInstructions[] =
131 1.1.1.2 jruoho {
132 1.1.1.2 jruoho "Read Register",
133 1.1.1.2 jruoho "Read Register Value",
134 1.1.1.2 jruoho "Write Register",
135 1.1.1.2 jruoho "Write Register Value",
136 1.1.1.2 jruoho "Noop",
137 1.1.1.2 jruoho "Load Var1",
138 1.1.1.2 jruoho "Load Var2",
139 1.1.1.2 jruoho "Store Var1",
140 1.1.1.2 jruoho "Add",
141 1.1.1.2 jruoho "Subtract",
142 1.1.1.2 jruoho "Add Value",
143 1.1.1.2 jruoho "Subtract Value",
144 1.1.1.2 jruoho "Stall",
145 1.1.1.2 jruoho "Stall While True",
146 1.1.1.2 jruoho "Skip Next If True",
147 1.1.1.2 jruoho "GoTo",
148 1.1.1.2 jruoho "Set Source Address",
149 1.1.1.2 jruoho "Set Destination Address",
150 1.1.1.2 jruoho "Move Data",
151 1.1.1.2 jruoho "Unknown Instruction"
152 1.1.1.2 jruoho };
153 1.1.1.2 jruoho
154 1.1 jruoho static const char *AcpiDmHestSubnames[] =
155 1.1 jruoho {
156 1.1 jruoho "IA-32 Machine Check Exception",
157 1.1 jruoho "IA-32 Corrected Machine Check",
158 1.1 jruoho "IA-32 Non-Maskable Interrupt",
159 1.1 jruoho "Unknown SubTable Type", /* 3 - Reserved */
160 1.1 jruoho "Unknown SubTable Type", /* 4 - Reserved */
161 1.1 jruoho "Unknown SubTable Type", /* 5 - Reserved */
162 1.1 jruoho "PCI Express Root Port AER",
163 1.1 jruoho "PCI Express AER (AER Endpoint)",
164 1.1 jruoho "PCI Express/PCI-X Bridge AER",
165 1.1 jruoho "Generic Hardware Error Source",
166 1.1 jruoho "Unknown SubTable Type" /* Reserved */
167 1.1 jruoho };
168 1.1 jruoho
169 1.1 jruoho static const char *AcpiDmHestNotifySubnames[] =
170 1.1 jruoho {
171 1.1 jruoho "Polled",
172 1.1 jruoho "External Interrupt",
173 1.1 jruoho "Local Interrupt",
174 1.1 jruoho "SCI",
175 1.1 jruoho "NMI",
176 1.1 jruoho "Unknown Notify Type" /* Reserved */
177 1.1 jruoho };
178 1.1 jruoho
179 1.1 jruoho static const char *AcpiDmMadtSubnames[] =
180 1.1 jruoho {
181 1.1 jruoho "Processor Local APIC", /* ACPI_MADT_TYPE_LOCAL_APIC */
182 1.1 jruoho "I/O APIC", /* ACPI_MADT_TYPE_IO_APIC */
183 1.1 jruoho "Interrupt Source Override", /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */
184 1.1 jruoho "NMI Source", /* ACPI_MADT_TYPE_NMI_SOURCE */
185 1.1 jruoho "Local APIC NMI", /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */
186 1.1 jruoho "Local APIC Address Override", /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */
187 1.1 jruoho "I/O SAPIC", /* ACPI_MADT_TYPE_IO_SAPIC */
188 1.1 jruoho "Local SAPIC", /* ACPI_MADT_TYPE_LOCAL_SAPIC */
189 1.1 jruoho "Platform Interrupt Sources", /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */
190 1.1 jruoho "Processor Local x2APIC", /* ACPI_MADT_TYPE_LOCAL_X2APIC */
191 1.1 jruoho "Local x2APIC NMI", /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */
192 1.1 jruoho "Unknown SubTable Type" /* Reserved */
193 1.1 jruoho };
194 1.1 jruoho
195 1.1 jruoho static const char *AcpiDmSratSubnames[] =
196 1.1 jruoho {
197 1.1 jruoho "Processor Local APIC/SAPIC Affinity",
198 1.1 jruoho "Memory Affinity",
199 1.1 jruoho "Processor Local x2APIC Affinity",
200 1.1 jruoho "Unknown SubTable Type" /* Reserved */
201 1.1 jruoho };
202 1.1 jruoho
203 1.1 jruoho static const char *AcpiDmIvrsSubnames[] =
204 1.1 jruoho {
205 1.1 jruoho "Hardware Definition Block",
206 1.1 jruoho "Memory Definition Block",
207 1.1 jruoho "Unknown SubTable Type" /* Reserved */
208 1.1 jruoho };
209 1.1 jruoho
210 1.1 jruoho
211 1.1 jruoho #define ACPI_FADT_PM_RESERVED 8
212 1.1 jruoho
213 1.1 jruoho static const char *AcpiDmFadtProfiles[] =
214 1.1 jruoho {
215 1.1 jruoho "Unspecified",
216 1.1 jruoho "Desktop",
217 1.1 jruoho "Mobile",
218 1.1 jruoho "Workstation",
219 1.1 jruoho "Enterprise Server",
220 1.1 jruoho "SOHO Server",
221 1.1 jruoho "Appliance PC",
222 1.1 jruoho "Performance Server",
223 1.1 jruoho "Unknown Profile Type"
224 1.1 jruoho };
225 1.1 jruoho
226 1.1.1.2 jruoho #define ACPI_GAS_WIDTH_RESERVED 5
227 1.1.1.2 jruoho
228 1.1.1.2 jruoho static const char *AcpiDmGasAccessWidth[] =
229 1.1.1.2 jruoho {
230 1.1.1.2 jruoho "Undefined/Legacy",
231 1.1.1.2 jruoho "Byte Access:8",
232 1.1.1.2 jruoho "Word Access:16",
233 1.1.1.2 jruoho "DWord Access:32",
234 1.1.1.2 jruoho "QWord Access:64",
235 1.1.1.2 jruoho "Unknown Width Encoding"
236 1.1.1.2 jruoho };
237 1.1.1.2 jruoho
238 1.1.1.2 jruoho
239 1.1 jruoho /*******************************************************************************
240 1.1 jruoho *
241 1.1 jruoho * ACPI Table Data, indexed by signature.
242 1.1 jruoho *
243 1.1.1.2 jruoho * Each entry contains: Signature, Table Info, Handler, DtHandler,
244 1.1.1.2 jruoho * Template, Description
245 1.1 jruoho *
246 1.1.1.2 jruoho * Simple tables have only a TableInfo structure, complex tables have a
247 1.1.1.2 jruoho * handler. This table must be NULL terminated. RSDP and FACS are
248 1.1.1.2 jruoho * special-cased elsewhere.
249 1.1 jruoho *
250 1.1 jruoho ******************************************************************************/
251 1.1 jruoho
252 1.1.1.2 jruoho ACPI_DMTABLE_DATA AcpiDmTableData[] =
253 1.1 jruoho {
254 1.1.1.2 jruoho {ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, DtCompileAsf, TemplateAsf, "Alert Standard Format table"},
255 1.1.1.2 jruoho {ACPI_SIG_BOOT, AcpiDmTableInfoBoot, NULL, NULL, TemplateBoot, "Simple Boot Flag Table"},
256 1.1.1.2 jruoho {ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert, "Boot Error Record Table"},
257 1.1.1.2 jruoho {ACPI_SIG_CPEP, NULL, AcpiDmDumpCpep, DtCompileCpep, TemplateCpep, "Corrected Platform Error Polling table"},
258 1.1.1.2 jruoho {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp, NULL, NULL, TemplateDbgp, "Debug Port table"},
259 1.1.1.2 jruoho {ACPI_SIG_DMAR, NULL, AcpiDmDumpDmar, DtCompileDmar, TemplateDmar, "DMA Remapping table"},
260 1.1.1.2 jruoho {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt, NULL, NULL, TemplateEcdt, "Embedded Controller Boot Resources Table"},
261 1.1.1.2 jruoho {ACPI_SIG_EINJ, NULL, AcpiDmDumpEinj, DtCompileEinj, TemplateEinj, "Error Injection table"},
262 1.1.1.2 jruoho {ACPI_SIG_ERST, NULL, AcpiDmDumpErst, DtCompileErst, TemplateErst, "Error Record Serialization Table"},
263 1.1.1.2 jruoho {ACPI_SIG_FADT, NULL, AcpiDmDumpFadt, DtCompileFadt, TemplateFadt, "Fixed ACPI Description Table"},
264 1.1.1.2 jruoho {ACPI_SIG_HEST, NULL, AcpiDmDumpHest, DtCompileHest, TemplateHest, "Hardware Error Source Table"},
265 1.1.1.2 jruoho {ACPI_SIG_HPET, AcpiDmTableInfoHpet, NULL, NULL, TemplateHpet, "High Precision Event Timer table"},
266 1.1.1.2 jruoho {ACPI_SIG_IVRS, NULL, AcpiDmDumpIvrs, DtCompileIvrs, TemplateIvrs, "I/O Virtualization Reporting Structure"},
267 1.1.1.2 jruoho {ACPI_SIG_MADT, NULL, AcpiDmDumpMadt, DtCompileMadt, TemplateMadt, "Multiple APIC Description Table"},
268 1.1.1.2 jruoho {ACPI_SIG_MCFG, NULL, AcpiDmDumpMcfg, DtCompileMcfg, TemplateMcfg, "Memory Mapped Configuration table"},
269 1.1.1.2 jruoho {ACPI_SIG_MCHI, AcpiDmTableInfoMchi, NULL, NULL, TemplateMchi, "Management Controller Host Interface table"},
270 1.1.1.2 jruoho {ACPI_SIG_MSCT, NULL, AcpiDmDumpMsct, DtCompileMsct, TemplateMsct, "Maximum System Characteristics Table"},
271 1.1.1.2 jruoho {ACPI_SIG_RSDT, NULL, AcpiDmDumpRsdt, DtCompileRsdt, TemplateRsdt, "Root System Description Table"},
272 1.1.1.2 jruoho {ACPI_SIG_SBST, AcpiDmTableInfoSbst, NULL, NULL, TemplateSbst, "Smart Battery Specification Table"},
273 1.1.1.2 jruoho {ACPI_SIG_SLIC, AcpiDmTableInfoSlic, NULL, NULL, NULL, "Software Licensing Description Table"},
274 1.1.1.2 jruoho {ACPI_SIG_SLIT, NULL, AcpiDmDumpSlit, DtCompileSlit, TemplateSlit, "System Locality Information Table"},
275 1.1.1.2 jruoho {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr, NULL, NULL, TemplateSpcr, "Serial Port Console Redirection table"},
276 1.1.1.2 jruoho {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi, NULL, NULL, TemplateSpmi, "Server Platform Management Interface table"},
277 1.1.1.2 jruoho {ACPI_SIG_SRAT, NULL, AcpiDmDumpSrat, DtCompileSrat, TemplateSrat, "System Resource Affinity Table"},
278 1.1.1.2 jruoho {ACPI_SIG_TCPA, AcpiDmTableInfoTcpa, NULL, NULL, TemplateTcpa, "Trusted Computing Platform Alliance table"},
279 1.1.1.2 jruoho {ACPI_SIG_UEFI, AcpiDmTableInfoUefi, NULL, DtCompileUefi, TemplateUefi, "UEFI Boot Optimization Table"},
280 1.1.1.2 jruoho {ACPI_SIG_WAET, AcpiDmTableInfoWaet, NULL, NULL, TemplateWaet, "Windows ACPI Emulated Devices Table"},
281 1.1.1.2 jruoho {ACPI_SIG_WDAT, NULL, AcpiDmDumpWdat, DtCompileWdat, TemplateWdat, "Watchdog Action Table"},
282 1.1.1.2 jruoho {ACPI_SIG_WDDT, AcpiDmTableInfoWddt, NULL, NULL, TemplateWddt, "Watchdog Description Table"},
283 1.1.1.2 jruoho {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt, NULL, NULL, TemplateWdrt, "Watchdog Resource Table"},
284 1.1.1.2 jruoho {ACPI_SIG_XSDT, NULL, AcpiDmDumpXsdt, DtCompileXsdt, TemplateXsdt, "Extended System Description Table"},
285 1.1.1.2 jruoho {NULL, NULL, NULL, NULL, NULL, NULL}
286 1.1 jruoho };
287 1.1 jruoho
288 1.1 jruoho
289 1.1 jruoho /*******************************************************************************
290 1.1 jruoho *
291 1.1.1.2 jruoho * FUNCTION: AcpiDmGenerateChecksum
292 1.1 jruoho *
293 1.1.1.2 jruoho * PARAMETERS: Table - Pointer to table to be checksummed
294 1.1.1.2 jruoho * Length - Length of the table
295 1.1.1.2 jruoho * OriginalChecksum - Value of the checksum field
296 1.1 jruoho *
297 1.1 jruoho * RETURN: 8 bit checksum of buffer
298 1.1 jruoho *
299 1.1 jruoho * DESCRIPTION: Computes an 8 bit checksum of the table.
300 1.1 jruoho *
301 1.1 jruoho ******************************************************************************/
302 1.1 jruoho
303 1.1 jruoho UINT8
304 1.1.1.2 jruoho AcpiDmGenerateChecksum (
305 1.1.1.2 jruoho void *Table,
306 1.1.1.2 jruoho UINT32 Length,
307 1.1.1.2 jruoho UINT8 OriginalChecksum)
308 1.1 jruoho {
309 1.1 jruoho UINT8 Checksum;
310 1.1 jruoho
311 1.1 jruoho
312 1.1 jruoho /* Sum the entire table as-is */
313 1.1 jruoho
314 1.1.1.2 jruoho Checksum = AcpiTbChecksum ((UINT8 *) Table, Length);
315 1.1 jruoho
316 1.1 jruoho /* Subtract off the existing checksum value in the table */
317 1.1 jruoho
318 1.1.1.2 jruoho Checksum = (UINT8) (Checksum - OriginalChecksum);
319 1.1 jruoho
320 1.1 jruoho /* Compute the final checksum */
321 1.1 jruoho
322 1.1 jruoho Checksum = (UINT8) (0 - Checksum);
323 1.1 jruoho return (Checksum);
324 1.1 jruoho }
325 1.1 jruoho
326 1.1 jruoho
327 1.1 jruoho /*******************************************************************************
328 1.1 jruoho *
329 1.1 jruoho * FUNCTION: AcpiDmGetTableData
330 1.1 jruoho *
331 1.1 jruoho * PARAMETERS: Signature - ACPI signature (4 chars) to match
332 1.1 jruoho *
333 1.1 jruoho * RETURN: Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found.
334 1.1 jruoho *
335 1.1 jruoho * DESCRIPTION: Find a match in the global table of supported ACPI tables
336 1.1 jruoho *
337 1.1 jruoho ******************************************************************************/
338 1.1 jruoho
339 1.1 jruoho ACPI_DMTABLE_DATA *
340 1.1 jruoho AcpiDmGetTableData (
341 1.1 jruoho char *Signature)
342 1.1 jruoho {
343 1.1 jruoho ACPI_DMTABLE_DATA *TableData;
344 1.1 jruoho
345 1.1 jruoho
346 1.1 jruoho for (TableData = AcpiDmTableData; TableData->Signature; TableData++)
347 1.1 jruoho {
348 1.1 jruoho if (ACPI_COMPARE_NAME (Signature, TableData->Signature))
349 1.1 jruoho {
350 1.1 jruoho return (TableData);
351 1.1 jruoho }
352 1.1 jruoho }
353 1.1 jruoho
354 1.1 jruoho return (NULL);
355 1.1 jruoho }
356 1.1 jruoho
357 1.1 jruoho
358 1.1 jruoho /*******************************************************************************
359 1.1 jruoho *
360 1.1 jruoho * FUNCTION: AcpiDmDumpDataTable
361 1.1 jruoho *
362 1.1 jruoho * PARAMETERS: Table - An ACPI table
363 1.1 jruoho *
364 1.1 jruoho * RETURN: None.
365 1.1 jruoho *
366 1.1 jruoho * DESCRIPTION: Format the contents of an ACPI data table (any table other
367 1.1 jruoho * than an SSDT or DSDT that does not contain executable AML code)
368 1.1 jruoho *
369 1.1 jruoho ******************************************************************************/
370 1.1 jruoho
371 1.1 jruoho void
372 1.1 jruoho AcpiDmDumpDataTable (
373 1.1 jruoho ACPI_TABLE_HEADER *Table)
374 1.1 jruoho {
375 1.1 jruoho ACPI_STATUS Status;
376 1.1 jruoho ACPI_DMTABLE_DATA *TableData;
377 1.1 jruoho UINT32 Length;
378 1.1 jruoho
379 1.1 jruoho
380 1.1 jruoho /* Ignore tables that contain AML */
381 1.1 jruoho
382 1.1 jruoho if (AcpiUtIsAmlTable (Table))
383 1.1 jruoho {
384 1.1 jruoho return;
385 1.1 jruoho }
386 1.1 jruoho
387 1.1 jruoho /*
388 1.1 jruoho * Handle tables that don't use the common ACPI table header structure.
389 1.1 jruoho * Currently, these are the FACS and RSDP.
390 1.1 jruoho */
391 1.1 jruoho if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS))
392 1.1 jruoho {
393 1.1 jruoho Length = Table->Length;
394 1.1 jruoho AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs);
395 1.1 jruoho }
396 1.1 jruoho else if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_RSDP))
397 1.1 jruoho {
398 1.1 jruoho Length = AcpiDmDumpRsdp (Table);
399 1.1 jruoho }
400 1.1 jruoho else
401 1.1 jruoho {
402 1.1 jruoho /*
403 1.1 jruoho * All other tables must use the common ACPI table header, dump it now
404 1.1 jruoho */
405 1.1 jruoho Length = Table->Length;
406 1.1 jruoho Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader);
407 1.1 jruoho if (ACPI_FAILURE (Status))
408 1.1 jruoho {
409 1.1 jruoho return;
410 1.1 jruoho }
411 1.1 jruoho AcpiOsPrintf ("\n");
412 1.1 jruoho
413 1.1 jruoho /* Match signature and dispatch appropriately */
414 1.1 jruoho
415 1.1 jruoho TableData = AcpiDmGetTableData (Table->Signature);
416 1.1 jruoho if (!TableData)
417 1.1 jruoho {
418 1.1 jruoho if (!ACPI_STRNCMP (Table->Signature, "OEM", 3))
419 1.1 jruoho {
420 1.1 jruoho AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n",
421 1.1 jruoho Table->Signature);
422 1.1 jruoho }
423 1.1 jruoho else
424 1.1 jruoho {
425 1.1 jruoho AcpiOsPrintf ("\n**** Unknown ACPI table type [%4.4s]\n\n",
426 1.1 jruoho Table->Signature);
427 1.1 jruoho }
428 1.1 jruoho }
429 1.1 jruoho else if (TableData->TableHandler)
430 1.1 jruoho {
431 1.1 jruoho /* Complex table, has a handler */
432 1.1 jruoho
433 1.1 jruoho TableData->TableHandler (Table);
434 1.1 jruoho }
435 1.1 jruoho else if (TableData->TableInfo)
436 1.1 jruoho {
437 1.1 jruoho /* Simple table, just walk the info table */
438 1.1 jruoho
439 1.1 jruoho AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo);
440 1.1 jruoho }
441 1.1 jruoho }
442 1.1 jruoho
443 1.1.1.2 jruoho if (!Gbl_DoTemplates || Gbl_VerboseTemplates)
444 1.1.1.2 jruoho {
445 1.1.1.2 jruoho /* Dump the raw table data */
446 1.1 jruoho
447 1.1.1.2 jruoho AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n",
448 1.1.1.2 jruoho ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
449 1.1.1.2 jruoho AcpiUtDumpBuffer2 (ACPI_CAST_PTR (UINT8, Table), Length, DB_BYTE_DISPLAY);
450 1.1.1.2 jruoho }
451 1.1 jruoho }
452 1.1 jruoho
453 1.1 jruoho
454 1.1 jruoho /*******************************************************************************
455 1.1 jruoho *
456 1.1 jruoho * FUNCTION: AcpiDmLineHeader
457 1.1 jruoho *
458 1.1 jruoho * PARAMETERS: Offset - Current byte offset, from table start
459 1.1 jruoho * ByteLength - Length of the field in bytes, 0 for flags
460 1.1 jruoho * Name - Name of this field
461 1.1 jruoho * Value - Optional value, displayed on left of ':'
462 1.1 jruoho *
463 1.1 jruoho * RETURN: None
464 1.1 jruoho *
465 1.1 jruoho * DESCRIPTION: Utility routines for formatting output lines. Displays the
466 1.1 jruoho * current table offset in hex and decimal, the field length,
467 1.1 jruoho * and the field name.
468 1.1 jruoho *
469 1.1 jruoho ******************************************************************************/
470 1.1 jruoho
471 1.1 jruoho void
472 1.1 jruoho AcpiDmLineHeader (
473 1.1 jruoho UINT32 Offset,
474 1.1 jruoho UINT32 ByteLength,
475 1.1 jruoho char *Name)
476 1.1 jruoho {
477 1.1 jruoho
478 1.1.1.2 jruoho if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */
479 1.1 jruoho {
480 1.1.1.2 jruoho if (ByteLength)
481 1.1.1.2 jruoho {
482 1.1.1.2 jruoho AcpiOsPrintf ("[%.3d] %34s : ",
483 1.1.1.2 jruoho ByteLength, Name);
484 1.1.1.2 jruoho }
485 1.1.1.2 jruoho else
486 1.1.1.2 jruoho {
487 1.1.1.2 jruoho AcpiOsPrintf ("%40s : ",
488 1.1.1.2 jruoho Name);
489 1.1.1.2 jruoho }
490 1.1 jruoho }
491 1.1.1.2 jruoho else /* Normal disassembler or verbose template */
492 1.1 jruoho {
493 1.1.1.2 jruoho if (ByteLength)
494 1.1.1.2 jruoho {
495 1.1.1.2 jruoho AcpiOsPrintf ("[%3.3Xh %4.4d% 3d] %28s : ",
496 1.1.1.2 jruoho Offset, Offset, ByteLength, Name);
497 1.1.1.2 jruoho }
498 1.1.1.2 jruoho else
499 1.1.1.2 jruoho {
500 1.1.1.2 jruoho AcpiOsPrintf ("%43s : ",
501 1.1.1.2 jruoho Name);
502 1.1.1.2 jruoho }
503 1.1 jruoho }
504 1.1 jruoho }
505 1.1 jruoho
506 1.1 jruoho void
507 1.1 jruoho AcpiDmLineHeader2 (
508 1.1 jruoho UINT32 Offset,
509 1.1 jruoho UINT32 ByteLength,
510 1.1 jruoho char *Name,
511 1.1 jruoho UINT32 Value)
512 1.1 jruoho {
513 1.1 jruoho
514 1.1.1.2 jruoho if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */
515 1.1 jruoho {
516 1.1.1.2 jruoho if (ByteLength)
517 1.1.1.2 jruoho {
518 1.1.1.2 jruoho AcpiOsPrintf ("[%.3d] %30s % 3d : ",
519 1.1.1.2 jruoho ByteLength, Name, Value);
520 1.1.1.2 jruoho }
521 1.1.1.2 jruoho else
522 1.1.1.2 jruoho {
523 1.1.1.2 jruoho AcpiOsPrintf ("%36s % 3d : ",
524 1.1.1.2 jruoho Name, Value);
525 1.1.1.2 jruoho }
526 1.1 jruoho }
527 1.1.1.2 jruoho else /* Normal disassembler or verbose template */
528 1.1 jruoho {
529 1.1.1.2 jruoho if (ByteLength)
530 1.1.1.2 jruoho {
531 1.1.1.2 jruoho AcpiOsPrintf ("[%3.3Xh %4.4d% 3d] %24s % 3d : ",
532 1.1.1.2 jruoho Offset, Offset, ByteLength, Name, Value);
533 1.1.1.2 jruoho }
534 1.1.1.2 jruoho else
535 1.1.1.2 jruoho {
536 1.1.1.2 jruoho AcpiOsPrintf ("[%3.3Xh %4.4d ] %24s % 3d : ",
537 1.1.1.2 jruoho Offset, Offset, Name, Value);
538 1.1.1.2 jruoho }
539 1.1 jruoho }
540 1.1 jruoho }
541 1.1 jruoho
542 1.1 jruoho
543 1.1 jruoho /*******************************************************************************
544 1.1 jruoho *
545 1.1 jruoho * FUNCTION: AcpiDmDumpTable
546 1.1 jruoho *
547 1.1 jruoho * PARAMETERS: TableLength - Length of the entire ACPI table
548 1.1 jruoho * TableOffset - Starting offset within the table for this
549 1.1 jruoho * sub-descriptor (0 if main table)
550 1.1 jruoho * Table - The ACPI table
551 1.1 jruoho * SubtableLength - Length of this sub-descriptor
552 1.1 jruoho * Info - Info table for this ACPI table
553 1.1 jruoho *
554 1.1 jruoho * RETURN: None
555 1.1 jruoho *
556 1.1 jruoho * DESCRIPTION: Display ACPI table contents by walking the Info table.
557 1.1 jruoho *
558 1.1.1.2 jruoho * Note: This function must remain in sync with DtGetFieldLength.
559 1.1.1.2 jruoho *
560 1.1 jruoho ******************************************************************************/
561 1.1 jruoho
562 1.1 jruoho ACPI_STATUS
563 1.1 jruoho AcpiDmDumpTable (
564 1.1 jruoho UINT32 TableLength,
565 1.1 jruoho UINT32 TableOffset,
566 1.1 jruoho void *Table,
567 1.1 jruoho UINT32 SubtableLength,
568 1.1 jruoho ACPI_DMTABLE_INFO *Info)
569 1.1 jruoho {
570 1.1 jruoho UINT8 *Target;
571 1.1 jruoho UINT32 CurrentOffset;
572 1.1 jruoho UINT32 ByteLength;
573 1.1 jruoho UINT8 Temp8;
574 1.1 jruoho UINT16 Temp16;
575 1.1 jruoho ACPI_DMTABLE_DATA *TableData;
576 1.1 jruoho const char *Name;
577 1.1 jruoho BOOLEAN LastOutputBlankLine = FALSE;
578 1.1 jruoho char RepairedName[8];
579 1.1 jruoho
580 1.1 jruoho
581 1.1 jruoho if (!Info)
582 1.1 jruoho {
583 1.1 jruoho AcpiOsPrintf ("Display not implemented\n");
584 1.1 jruoho return (AE_NOT_IMPLEMENTED);
585 1.1 jruoho }
586 1.1 jruoho
587 1.1 jruoho /* Walk entire Info table; Null name terminates */
588 1.1 jruoho
589 1.1 jruoho for (; Info->Name; Info++)
590 1.1 jruoho {
591 1.1 jruoho /*
592 1.1 jruoho * Target points to the field within the ACPI Table. CurrentOffset is
593 1.1 jruoho * the offset of the field from the start of the main table.
594 1.1 jruoho */
595 1.1 jruoho Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset);
596 1.1 jruoho CurrentOffset = TableOffset + Info->Offset;
597 1.1 jruoho
598 1.1 jruoho /* Check for beyond EOT or beyond subtable end */
599 1.1 jruoho
600 1.1 jruoho if ((CurrentOffset >= TableLength) ||
601 1.1 jruoho (SubtableLength && (Info->Offset >= SubtableLength)))
602 1.1 jruoho {
603 1.1 jruoho AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
604 1.1 jruoho return (AE_BAD_DATA);
605 1.1 jruoho }
606 1.1 jruoho
607 1.1 jruoho /* Generate the byte length for this field */
608 1.1 jruoho
609 1.1 jruoho switch (Info->Opcode)
610 1.1 jruoho {
611 1.1 jruoho case ACPI_DMT_UINT8:
612 1.1 jruoho case ACPI_DMT_CHKSUM:
613 1.1 jruoho case ACPI_DMT_SPACEID:
614 1.1.1.2 jruoho case ACPI_DMT_ACCWIDTH:
615 1.1 jruoho case ACPI_DMT_IVRS:
616 1.1 jruoho case ACPI_DMT_MADT:
617 1.1 jruoho case ACPI_DMT_SRAT:
618 1.1 jruoho case ACPI_DMT_ASF:
619 1.1 jruoho case ACPI_DMT_HESTNTYP:
620 1.1 jruoho case ACPI_DMT_FADTPM:
621 1.1.1.2 jruoho case ACPI_DMT_EINJACT:
622 1.1.1.2 jruoho case ACPI_DMT_EINJINST:
623 1.1.1.2 jruoho case ACPI_DMT_ERSTACT:
624 1.1.1.2 jruoho case ACPI_DMT_ERSTINST:
625 1.1 jruoho ByteLength = 1;
626 1.1 jruoho break;
627 1.1 jruoho case ACPI_DMT_UINT16:
628 1.1 jruoho case ACPI_DMT_DMAR:
629 1.1 jruoho case ACPI_DMT_HEST:
630 1.1 jruoho ByteLength = 2;
631 1.1 jruoho break;
632 1.1 jruoho case ACPI_DMT_UINT24:
633 1.1 jruoho ByteLength = 3;
634 1.1 jruoho break;
635 1.1 jruoho case ACPI_DMT_UINT32:
636 1.1 jruoho case ACPI_DMT_NAME4:
637 1.1 jruoho case ACPI_DMT_SIG:
638 1.1 jruoho ByteLength = 4;
639 1.1 jruoho break;
640 1.1 jruoho case ACPI_DMT_NAME6:
641 1.1 jruoho ByteLength = 6;
642 1.1 jruoho break;
643 1.1 jruoho case ACPI_DMT_UINT56:
644 1.1.1.2 jruoho case ACPI_DMT_BUF7:
645 1.1 jruoho ByteLength = 7;
646 1.1 jruoho break;
647 1.1 jruoho case ACPI_DMT_UINT64:
648 1.1 jruoho case ACPI_DMT_NAME8:
649 1.1 jruoho ByteLength = 8;
650 1.1 jruoho break;
651 1.1 jruoho case ACPI_DMT_BUF16:
652 1.1.1.2 jruoho case ACPI_DMT_UUID:
653 1.1 jruoho ByteLength = 16;
654 1.1 jruoho break;
655 1.1 jruoho case ACPI_DMT_STRING:
656 1.1 jruoho ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1;
657 1.1 jruoho break;
658 1.1 jruoho case ACPI_DMT_GAS:
659 1.1 jruoho if (!LastOutputBlankLine)
660 1.1 jruoho {
661 1.1 jruoho AcpiOsPrintf ("\n");
662 1.1 jruoho LastOutputBlankLine = TRUE;
663 1.1 jruoho }
664 1.1 jruoho ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
665 1.1 jruoho break;
666 1.1 jruoho case ACPI_DMT_HESTNTFY:
667 1.1 jruoho if (!LastOutputBlankLine)
668 1.1 jruoho {
669 1.1 jruoho AcpiOsPrintf ("\n");
670 1.1 jruoho LastOutputBlankLine = TRUE;
671 1.1 jruoho }
672 1.1 jruoho ByteLength = sizeof (ACPI_HEST_NOTIFY);
673 1.1 jruoho break;
674 1.1 jruoho default:
675 1.1 jruoho ByteLength = 0;
676 1.1 jruoho break;
677 1.1 jruoho }
678 1.1 jruoho
679 1.1 jruoho if (CurrentOffset + ByteLength > TableLength)
680 1.1 jruoho {
681 1.1 jruoho AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
682 1.1 jruoho return (AE_BAD_DATA);
683 1.1 jruoho }
684 1.1 jruoho
685 1.1 jruoho /* Start a new line and decode the opcode */
686 1.1 jruoho
687 1.1 jruoho AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name);
688 1.1 jruoho
689 1.1 jruoho switch (Info->Opcode)
690 1.1 jruoho {
691 1.1 jruoho /* Single-bit Flag fields. Note: Opcode is the bit position */
692 1.1 jruoho
693 1.1 jruoho case ACPI_DMT_FLAG0:
694 1.1 jruoho case ACPI_DMT_FLAG1:
695 1.1 jruoho case ACPI_DMT_FLAG2:
696 1.1 jruoho case ACPI_DMT_FLAG3:
697 1.1 jruoho case ACPI_DMT_FLAG4:
698 1.1 jruoho case ACPI_DMT_FLAG5:
699 1.1 jruoho case ACPI_DMT_FLAG6:
700 1.1 jruoho case ACPI_DMT_FLAG7:
701 1.1 jruoho
702 1.1 jruoho AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01);
703 1.1 jruoho break;
704 1.1 jruoho
705 1.1 jruoho /* 2-bit Flag fields */
706 1.1 jruoho
707 1.1 jruoho case ACPI_DMT_FLAGS0:
708 1.1 jruoho
709 1.1 jruoho AcpiOsPrintf ("%1.1X\n", *Target & 0x03);
710 1.1 jruoho break;
711 1.1 jruoho
712 1.1 jruoho case ACPI_DMT_FLAGS2:
713 1.1 jruoho
714 1.1 jruoho AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03);
715 1.1 jruoho break;
716 1.1 jruoho
717 1.1 jruoho /* Standard Data Types */
718 1.1 jruoho
719 1.1 jruoho case ACPI_DMT_UINT8:
720 1.1 jruoho
721 1.1 jruoho AcpiOsPrintf ("%2.2X\n", *Target);
722 1.1 jruoho break;
723 1.1 jruoho
724 1.1 jruoho case ACPI_DMT_UINT16:
725 1.1 jruoho
726 1.1 jruoho AcpiOsPrintf ("%4.4X\n", ACPI_GET16 (Target));
727 1.1 jruoho break;
728 1.1 jruoho
729 1.1 jruoho case ACPI_DMT_UINT24:
730 1.1 jruoho
731 1.1 jruoho AcpiOsPrintf ("%2.2X%2.2X%2.2X\n",
732 1.1 jruoho *Target, *(Target + 1), *(Target + 2));
733 1.1 jruoho break;
734 1.1 jruoho
735 1.1 jruoho case ACPI_DMT_UINT32:
736 1.1 jruoho
737 1.1 jruoho AcpiOsPrintf ("%8.8X\n", ACPI_GET32 (Target));
738 1.1 jruoho break;
739 1.1 jruoho
740 1.1 jruoho case ACPI_DMT_UINT56:
741 1.1 jruoho
742 1.1 jruoho for (Temp8 = 0; Temp8 < 7; Temp8++)
743 1.1 jruoho {
744 1.1 jruoho AcpiOsPrintf ("%2.2X", Target[Temp8]);
745 1.1 jruoho }
746 1.1 jruoho AcpiOsPrintf ("\n");
747 1.1 jruoho break;
748 1.1 jruoho
749 1.1 jruoho case ACPI_DMT_UINT64:
750 1.1 jruoho
751 1.1 jruoho AcpiOsPrintf ("%8.8X%8.8X\n",
752 1.1 jruoho ACPI_FORMAT_UINT64 (ACPI_GET64 (Target)));
753 1.1 jruoho break;
754 1.1 jruoho
755 1.1.1.2 jruoho case ACPI_DMT_BUF7:
756 1.1 jruoho case ACPI_DMT_BUF16:
757 1.1 jruoho
758 1.1.1.2 jruoho /*
759 1.1.1.2 jruoho * Buffer: Size depends on the opcode and was set above.
760 1.1.1.2 jruoho * Each hex byte is separated with a space.
761 1.1.1.2 jruoho */
762 1.1.1.2 jruoho for (Temp8 = 0; Temp8 < ByteLength; Temp8++)
763 1.1 jruoho {
764 1.1.1.2 jruoho AcpiOsPrintf ("%2.2X", Target[Temp8]);
765 1.1.1.2 jruoho if ((UINT32) (Temp8 + 1) < ByteLength)
766 1.1.1.2 jruoho {
767 1.1.1.2 jruoho AcpiOsPrintf (" ");
768 1.1.1.2 jruoho }
769 1.1 jruoho }
770 1.1 jruoho AcpiOsPrintf ("\n");
771 1.1 jruoho break;
772 1.1 jruoho
773 1.1.1.2 jruoho case ACPI_DMT_UUID:
774 1.1.1.2 jruoho
775 1.1.1.2 jruoho /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */
776 1.1.1.2 jruoho
777 1.1.1.2 jruoho (void) AuConvertUuidToString ((char *) Target, MsgBuffer);
778 1.1.1.2 jruoho
779 1.1.1.2 jruoho AcpiOsPrintf ("%s\n", MsgBuffer);
780 1.1.1.2 jruoho break;
781 1.1.1.2 jruoho
782 1.1 jruoho case ACPI_DMT_STRING:
783 1.1 jruoho
784 1.1 jruoho AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target));
785 1.1 jruoho break;
786 1.1 jruoho
787 1.1 jruoho /* Fixed length ASCII name fields */
788 1.1 jruoho
789 1.1 jruoho case ACPI_DMT_SIG:
790 1.1 jruoho
791 1.1 jruoho AcpiDmCheckAscii (Target, RepairedName, 4);
792 1.1 jruoho AcpiOsPrintf ("\"%.4s\" ", RepairedName);
793 1.1 jruoho TableData = AcpiDmGetTableData (ACPI_CAST_PTR (char, Target));
794 1.1 jruoho if (TableData)
795 1.1 jruoho {
796 1.1 jruoho AcpiOsPrintf ("/* %s */", TableData->Name);
797 1.1 jruoho }
798 1.1 jruoho AcpiOsPrintf ("\n");
799 1.1 jruoho break;
800 1.1 jruoho
801 1.1 jruoho case ACPI_DMT_NAME4:
802 1.1 jruoho
803 1.1 jruoho AcpiDmCheckAscii (Target, RepairedName, 4);
804 1.1 jruoho AcpiOsPrintf ("\"%.4s\"\n", RepairedName);
805 1.1 jruoho break;
806 1.1 jruoho
807 1.1 jruoho case ACPI_DMT_NAME6:
808 1.1 jruoho
809 1.1 jruoho AcpiDmCheckAscii (Target, RepairedName, 6);
810 1.1 jruoho AcpiOsPrintf ("\"%.6s\"\n", RepairedName);
811 1.1 jruoho break;
812 1.1 jruoho
813 1.1 jruoho case ACPI_DMT_NAME8:
814 1.1 jruoho
815 1.1 jruoho AcpiDmCheckAscii (Target, RepairedName, 8);
816 1.1 jruoho AcpiOsPrintf ("\"%.8s\"\n", RepairedName);
817 1.1 jruoho break;
818 1.1 jruoho
819 1.1 jruoho /* Special Data Types */
820 1.1 jruoho
821 1.1 jruoho case ACPI_DMT_CHKSUM:
822 1.1 jruoho
823 1.1 jruoho /* Checksum, display and validate */
824 1.1 jruoho
825 1.1 jruoho AcpiOsPrintf ("%2.2X", *Target);
826 1.1.1.2 jruoho Temp8 = AcpiDmGenerateChecksum (Table,
827 1.1.1.2 jruoho ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
828 1.1.1.2 jruoho ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum);
829 1.1 jruoho if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
830 1.1 jruoho {
831 1.1 jruoho AcpiOsPrintf (
832 1.1 jruoho " /* Incorrect checksum, should be %2.2X */", Temp8);
833 1.1 jruoho }
834 1.1 jruoho AcpiOsPrintf ("\n");
835 1.1 jruoho break;
836 1.1 jruoho
837 1.1 jruoho case ACPI_DMT_SPACEID:
838 1.1 jruoho
839 1.1 jruoho /* Address Space ID */
840 1.1 jruoho
841 1.1 jruoho AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiUtGetRegionName (*Target));
842 1.1 jruoho break;
843 1.1 jruoho
844 1.1.1.2 jruoho case ACPI_DMT_ACCWIDTH:
845 1.1.1.2 jruoho
846 1.1.1.2 jruoho /* Encoded Access Width */
847 1.1.1.2 jruoho
848 1.1.1.2 jruoho Temp8 = *Target;
849 1.1.1.2 jruoho if (Temp8 > ACPI_GAS_WIDTH_RESERVED)
850 1.1.1.2 jruoho {
851 1.1.1.2 jruoho Temp8 = ACPI_GAS_WIDTH_RESERVED;
852 1.1.1.2 jruoho }
853 1.1.1.2 jruoho
854 1.1.1.2 jruoho AcpiOsPrintf ("%2.2X (%s)\n", Temp8, AcpiDmGasAccessWidth[Temp8]);
855 1.1.1.2 jruoho break;
856 1.1.1.2 jruoho
857 1.1 jruoho case ACPI_DMT_GAS:
858 1.1 jruoho
859 1.1 jruoho /* Generic Address Structure */
860 1.1 jruoho
861 1.1 jruoho AcpiOsPrintf ("<Generic Address Structure>\n");
862 1.1 jruoho AcpiDmDumpTable (TableLength, CurrentOffset, Target,
863 1.1 jruoho sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas);
864 1.1 jruoho AcpiOsPrintf ("\n");
865 1.1 jruoho LastOutputBlankLine = TRUE;
866 1.1 jruoho break;
867 1.1 jruoho
868 1.1 jruoho case ACPI_DMT_ASF:
869 1.1 jruoho
870 1.1 jruoho /* ASF subtable types */
871 1.1 jruoho
872 1.1 jruoho Temp16 = (UINT16) ((*Target) & 0x7F); /* Top bit can be zero or one */
873 1.1 jruoho if (Temp16 > ACPI_ASF_TYPE_RESERVED)
874 1.1 jruoho {
875 1.1 jruoho Temp16 = ACPI_ASF_TYPE_RESERVED;
876 1.1 jruoho }
877 1.1 jruoho
878 1.1 jruoho AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmAsfSubnames[Temp16]);
879 1.1 jruoho break;
880 1.1 jruoho
881 1.1 jruoho case ACPI_DMT_DMAR:
882 1.1 jruoho
883 1.1 jruoho /* DMAR subtable types */
884 1.1 jruoho
885 1.1 jruoho Temp16 = ACPI_GET16 (Target);
886 1.1 jruoho if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
887 1.1 jruoho {
888 1.1 jruoho Temp16 = ACPI_DMAR_TYPE_RESERVED;
889 1.1 jruoho }
890 1.1 jruoho
891 1.1 jruoho AcpiOsPrintf ("%4.4X <%s>\n", ACPI_GET16 (Target), AcpiDmDmarSubnames[Temp16]);
892 1.1 jruoho break;
893 1.1 jruoho
894 1.1.1.2 jruoho case ACPI_DMT_EINJACT:
895 1.1.1.2 jruoho
896 1.1.1.2 jruoho /* EINJ Action types */
897 1.1.1.2 jruoho
898 1.1.1.2 jruoho Temp8 = *Target;
899 1.1.1.2 jruoho if (Temp8 > ACPI_EINJ_ACTION_RESERVED)
900 1.1.1.2 jruoho {
901 1.1.1.2 jruoho Temp8 = ACPI_EINJ_ACTION_RESERVED;
902 1.1.1.2 jruoho }
903 1.1.1.2 jruoho
904 1.1.1.2 jruoho AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmEinjActions[Temp8]);
905 1.1.1.2 jruoho break;
906 1.1.1.2 jruoho
907 1.1.1.2 jruoho case ACPI_DMT_EINJINST:
908 1.1.1.2 jruoho
909 1.1.1.2 jruoho /* EINJ Instruction types */
910 1.1.1.2 jruoho
911 1.1.1.2 jruoho Temp8 = *Target;
912 1.1.1.2 jruoho if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED)
913 1.1.1.2 jruoho {
914 1.1.1.2 jruoho Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED;
915 1.1.1.2 jruoho }
916 1.1.1.2 jruoho
917 1.1.1.2 jruoho AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmEinjInstructions[Temp8]);
918 1.1.1.2 jruoho break;
919 1.1.1.2 jruoho
920 1.1.1.2 jruoho case ACPI_DMT_ERSTACT:
921 1.1.1.2 jruoho
922 1.1.1.2 jruoho /* ERST Action types */
923 1.1.1.2 jruoho
924 1.1.1.2 jruoho Temp8 = *Target;
925 1.1.1.2 jruoho if (Temp8 > ACPI_ERST_ACTION_RESERVED)
926 1.1.1.2 jruoho {
927 1.1.1.2 jruoho Temp8 = ACPI_ERST_ACTION_RESERVED;
928 1.1.1.2 jruoho }
929 1.1.1.2 jruoho
930 1.1.1.2 jruoho AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmErstActions[Temp8]);
931 1.1.1.2 jruoho break;
932 1.1.1.2 jruoho
933 1.1.1.2 jruoho case ACPI_DMT_ERSTINST:
934 1.1.1.2 jruoho
935 1.1.1.2 jruoho /* ERST Instruction types */
936 1.1.1.2 jruoho
937 1.1.1.2 jruoho Temp8 = *Target;
938 1.1.1.2 jruoho if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED)
939 1.1.1.2 jruoho {
940 1.1.1.2 jruoho Temp8 = ACPI_ERST_INSTRUCTION_RESERVED;
941 1.1.1.2 jruoho }
942 1.1.1.2 jruoho
943 1.1.1.2 jruoho AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmErstInstructions[Temp8]);
944 1.1.1.2 jruoho break;
945 1.1.1.2 jruoho
946 1.1 jruoho case ACPI_DMT_HEST:
947 1.1 jruoho
948 1.1 jruoho /* HEST subtable types */
949 1.1 jruoho
950 1.1 jruoho Temp16 = ACPI_GET16 (Target);
951 1.1 jruoho if (Temp16 > ACPI_HEST_TYPE_RESERVED)
952 1.1 jruoho {
953 1.1 jruoho Temp16 = ACPI_HEST_TYPE_RESERVED;
954 1.1 jruoho }
955 1.1 jruoho
956 1.1 jruoho AcpiOsPrintf ("%4.4X (%s)\n", ACPI_GET16 (Target), AcpiDmHestSubnames[Temp16]);
957 1.1 jruoho break;
958 1.1 jruoho
959 1.1 jruoho case ACPI_DMT_HESTNTFY:
960 1.1 jruoho
961 1.1 jruoho AcpiOsPrintf ("<Hardware Error Notification Structure>\n");
962 1.1 jruoho AcpiDmDumpTable (TableLength, CurrentOffset, Target,
963 1.1 jruoho sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify);
964 1.1 jruoho AcpiOsPrintf ("\n");
965 1.1 jruoho LastOutputBlankLine = TRUE;
966 1.1 jruoho break;
967 1.1 jruoho
968 1.1 jruoho case ACPI_DMT_HESTNTYP:
969 1.1 jruoho
970 1.1 jruoho /* HEST Notify types */
971 1.1 jruoho
972 1.1 jruoho Temp8 = *Target;
973 1.1 jruoho if (Temp8 > ACPI_HEST_NOTIFY_RESERVED)
974 1.1 jruoho {
975 1.1 jruoho Temp8 = ACPI_HEST_NOTIFY_RESERVED;
976 1.1 jruoho }
977 1.1 jruoho
978 1.1 jruoho AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmHestNotifySubnames[Temp8]);
979 1.1 jruoho break;
980 1.1 jruoho
981 1.1 jruoho case ACPI_DMT_MADT:
982 1.1 jruoho
983 1.1 jruoho /* MADT subtable types */
984 1.1 jruoho
985 1.1 jruoho Temp8 = *Target;
986 1.1 jruoho if (Temp8 > ACPI_MADT_TYPE_RESERVED)
987 1.1 jruoho {
988 1.1 jruoho Temp8 = ACPI_MADT_TYPE_RESERVED;
989 1.1 jruoho }
990 1.1 jruoho
991 1.1 jruoho AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmMadtSubnames[Temp8]);
992 1.1 jruoho break;
993 1.1 jruoho
994 1.1 jruoho case ACPI_DMT_SRAT:
995 1.1 jruoho
996 1.1 jruoho /* SRAT subtable types */
997 1.1 jruoho
998 1.1 jruoho Temp8 = *Target;
999 1.1 jruoho if (Temp8 > ACPI_SRAT_TYPE_RESERVED)
1000 1.1 jruoho {
1001 1.1 jruoho Temp8 = ACPI_SRAT_TYPE_RESERVED;
1002 1.1 jruoho }
1003 1.1 jruoho
1004 1.1 jruoho AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmSratSubnames[Temp8]);
1005 1.1 jruoho break;
1006 1.1 jruoho
1007 1.1 jruoho case ACPI_DMT_FADTPM:
1008 1.1 jruoho
1009 1.1 jruoho /* FADT Preferred PM Profile names */
1010 1.1 jruoho
1011 1.1 jruoho Temp8 = *Target;
1012 1.1 jruoho if (Temp8 > ACPI_FADT_PM_RESERVED)
1013 1.1 jruoho {
1014 1.1 jruoho Temp8 = ACPI_FADT_PM_RESERVED;
1015 1.1 jruoho }
1016 1.1 jruoho
1017 1.1 jruoho AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmFadtProfiles[Temp8]);
1018 1.1 jruoho break;
1019 1.1 jruoho
1020 1.1 jruoho case ACPI_DMT_IVRS:
1021 1.1 jruoho
1022 1.1 jruoho /* IVRS subtable types */
1023 1.1 jruoho
1024 1.1 jruoho Temp8 = *Target;
1025 1.1 jruoho switch (Temp8)
1026 1.1 jruoho {
1027 1.1 jruoho case ACPI_IVRS_TYPE_HARDWARE:
1028 1.1 jruoho Name = AcpiDmIvrsSubnames[0];
1029 1.1 jruoho break;
1030 1.1 jruoho
1031 1.1 jruoho case ACPI_IVRS_TYPE_MEMORY1:
1032 1.1 jruoho case ACPI_IVRS_TYPE_MEMORY2:
1033 1.1 jruoho case ACPI_IVRS_TYPE_MEMORY3:
1034 1.1 jruoho Name = AcpiDmIvrsSubnames[1];
1035 1.1 jruoho break;
1036 1.1 jruoho
1037 1.1 jruoho default:
1038 1.1 jruoho Name = AcpiDmIvrsSubnames[2];
1039 1.1 jruoho break;
1040 1.1 jruoho }
1041 1.1 jruoho
1042 1.1 jruoho AcpiOsPrintf ("%2.2X <%s>\n", *Target, Name);
1043 1.1 jruoho break;
1044 1.1 jruoho
1045 1.1 jruoho case ACPI_DMT_EXIT:
1046 1.1 jruoho return (AE_OK);
1047 1.1 jruoho
1048 1.1 jruoho default:
1049 1.1 jruoho ACPI_ERROR ((AE_INFO,
1050 1.1 jruoho "**** Invalid table opcode [0x%X] ****\n", Info->Opcode));
1051 1.1 jruoho return (AE_SUPPORT);
1052 1.1 jruoho }
1053 1.1 jruoho }
1054 1.1 jruoho
1055 1.1 jruoho if (TableOffset && !SubtableLength)
1056 1.1 jruoho {
1057 1.1 jruoho /* If this table is not the main table, subtable must have valid length */
1058 1.1 jruoho
1059 1.1 jruoho AcpiOsPrintf ("Invalid zero length subtable\n");
1060 1.1 jruoho return (AE_BAD_DATA);
1061 1.1 jruoho }
1062 1.1 jruoho
1063 1.1 jruoho return (AE_OK);
1064 1.1 jruoho }
1065 1.1 jruoho
1066 1.1 jruoho
1067 1.1 jruoho /*******************************************************************************
1068 1.1 jruoho *
1069 1.1 jruoho * FUNCTION: AcpiDmCheckAscii
1070 1.1 jruoho *
1071 1.1 jruoho * PARAMETERS: Name - Ascii string
1072 1.1 jruoho * Count - Number of characters to check
1073 1.1 jruoho *
1074 1.1 jruoho * RETURN: None
1075 1.1 jruoho *
1076 1.1 jruoho * DESCRIPTION: Ensure that the requested number of characters are printable
1077 1.1 jruoho * Ascii characters. Sets non-printable and null chars to <space>.
1078 1.1 jruoho *
1079 1.1 jruoho ******************************************************************************/
1080 1.1 jruoho
1081 1.1 jruoho static void
1082 1.1 jruoho AcpiDmCheckAscii (
1083 1.1 jruoho UINT8 *Name,
1084 1.1 jruoho char *RepairedName,
1085 1.1 jruoho UINT32 Count)
1086 1.1 jruoho {
1087 1.1 jruoho UINT32 i;
1088 1.1 jruoho
1089 1.1 jruoho
1090 1.1 jruoho for (i = 0; i < Count; i++)
1091 1.1 jruoho {
1092 1.1 jruoho RepairedName[i] = (char) Name[i];
1093 1.1 jruoho
1094 1.1 jruoho if (!Name[i])
1095 1.1 jruoho {
1096 1.1 jruoho return;
1097 1.1 jruoho }
1098 1.1 jruoho if (!isprint (Name[i]))
1099 1.1 jruoho {
1100 1.1 jruoho RepairedName[i] = ' ';
1101 1.1 jruoho }
1102 1.1 jruoho }
1103 1.1 jruoho }
1104