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