dmtable.c revision 1.1.1.19 1 /******************************************************************************
2 *
3 * Module Name: dmtable - Support for ACPI tables that contain no AML code
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2021, 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 MERCHANTABILITY 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 "acdisasm.h"
47 #include "actables.h"
48 #include "aslcompiler.h"
49
50 /* This module used for application-level code only */
51
52 #define _COMPONENT ACPI_CA_DISASSEMBLER
53 ACPI_MODULE_NAME ("dmtable")
54
55 const AH_TABLE *
56 AcpiAhGetTableInfo (
57 char *Signature);
58
59
60 /* Common format strings for commented values */
61
62 #define UINT8_FORMAT "%2.2X [%s]\n"
63 #define UINT16_FORMAT "%4.4X [%s]\n"
64 #define UINT32_FORMAT "%8.8X [%s]\n"
65 #define STRING_FORMAT "[%s]\n"
66
67 /* These tables map a subtable type to a description string */
68
69 static const char *AcpiDmAsfSubnames[] =
70 {
71 "ASF Information",
72 "ASF Alerts",
73 "ASF Remote Control",
74 "ASF RMCP Boot Options",
75 "ASF Address",
76 "Unknown Subtable Type" /* Reserved */
77 };
78
79 static const char *AcpiDmCedtSubnames[] =
80 {
81 "CXL Host Bridge Structure",
82 "CXL Fixed Memory Window Structure",
83 "Unknown Subtable Type" /* Reserved */
84 };
85
86 static const char *AcpiDmDmarSubnames[] =
87 {
88 "Hardware Unit Definition",
89 "Reserved Memory Region",
90 "Root Port ATS Capability",
91 "Remapping Hardware Static Affinity",
92 "ACPI Namespace Device Declaration",
93 "Unknown Subtable Type" /* Reserved */
94 };
95
96 static const char *AcpiDmDmarScope[] =
97 {
98 "Reserved value",
99 "PCI Endpoint Device",
100 "PCI Bridge Device",
101 "IOAPIC Device",
102 "Message-capable HPET Device",
103 "Namespace Device",
104 "Unknown Scope Type" /* Reserved */
105 };
106
107 static const char *AcpiDmEinjActions[] =
108 {
109 "Begin Operation",
110 "Get Trigger Table",
111 "Set Error Type",
112 "Get Error Type",
113 "End Operation",
114 "Execute Operation",
115 "Check Busy Status",
116 "Get Command Status",
117 "Set Error Type With Address",
118 "Get Execute Timings",
119 "Unknown Action"
120 };
121
122 static const char *AcpiDmEinjInstructions[] =
123 {
124 "Read Register",
125 "Read Register Value",
126 "Write Register",
127 "Write Register Value",
128 "Noop",
129 "Flush Cacheline",
130 "Unknown Instruction"
131 };
132
133 static const char *AcpiDmErstActions[] =
134 {
135 "Begin Write Operation",
136 "Begin Read Operation",
137 "Begin Clear Operation",
138 "End Operation",
139 "Set Record Offset",
140 "Execute Operation",
141 "Check Busy Status",
142 "Get Command Status",
143 "Get Record Identifier",
144 "Set Record Identifier",
145 "Get Record Count",
146 "Begin Dummy Write",
147 "Unused/Unknown Action",
148 "Get Error Address Range",
149 "Get Error Address Length",
150 "Get Error Attributes",
151 "Execute Timings",
152 "Unknown Action"
153 };
154
155 static const char *AcpiDmErstInstructions[] =
156 {
157 "Read Register",
158 "Read Register Value",
159 "Write Register",
160 "Write Register Value",
161 "Noop",
162 "Load Var1",
163 "Load Var2",
164 "Store Var1",
165 "Add",
166 "Subtract",
167 "Add Value",
168 "Subtract Value",
169 "Stall",
170 "Stall While True",
171 "Skip Next If True",
172 "GoTo",
173 "Set Source Address",
174 "Set Destination Address",
175 "Move Data",
176 "Unknown Instruction"
177 };
178
179 static const char *AcpiDmGtdtSubnames[] =
180 {
181 "Generic Timer Block",
182 "Generic Watchdog Timer",
183 "Unknown Subtable Type" /* Reserved */
184 };
185
186 static const char *AcpiDmHestSubnames[] =
187 {
188 "IA-32 Machine Check Exception",
189 "IA-32 Corrected Machine Check",
190 "IA-32 Non-Maskable Interrupt",
191 "Unknown Subtable Type", /* 3 - Reserved */
192 "Unknown Subtable Type", /* 4 - Reserved */
193 "Unknown Subtable Type", /* 5 - Reserved */
194 "PCI Express Root Port AER",
195 "PCI Express AER (AER Endpoint)",
196 "PCI Express/PCI-X Bridge AER",
197 "Generic Hardware Error Source",
198 "Generic Hardware Error Source V2",
199 "IA-32 Deferred Machine Check",
200 "Unknown Subtable Type" /* Reserved */
201 };
202
203 static const char *AcpiDmHestNotifySubnames[] =
204 {
205 "Polled",
206 "External Interrupt",
207 "Local Interrupt",
208 "SCI",
209 "NMI",
210 "CMCI", /* ACPI 5.0 */
211 "MCE", /* ACPI 5.0 */
212 "GPIO", /* ACPI 6.0 */
213 "SEA", /* ACPI 6.1 */
214 "SEI", /* ACPI 6.1 */
215 "GSIV", /* ACPI 6.1 */
216 "Software Delegated Exception", /* ACPI 6.2 */
217 "Unknown Notify Type" /* Reserved */
218 };
219
220 static const char *AcpiDmHmatSubnames[] =
221 {
222 "Memory Proximity Domain Attributes",
223 "System Locality Latency and Bandwidth Information",
224 "Memory Side Cache Information",
225 "Unknown Structure Type" /* Reserved */
226 };
227
228 static const char *AcpiDmMadtSubnames[] =
229 {
230 "Processor Local APIC", /* ACPI_MADT_TYPE_LOCAL_APIC */
231 "I/O APIC", /* ACPI_MADT_TYPE_IO_APIC */
232 "Interrupt Source Override", /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */
233 "NMI Source", /* ACPI_MADT_TYPE_NMI_SOURCE */
234 "Local APIC NMI", /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */
235 "Local APIC Address Override", /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */
236 "I/O SAPIC", /* ACPI_MADT_TYPE_IO_SAPIC */
237 "Local SAPIC", /* ACPI_MADT_TYPE_LOCAL_SAPIC */
238 "Platform Interrupt Sources", /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */
239 "Processor Local x2APIC", /* ACPI_MADT_TYPE_LOCAL_X2APIC */
240 "Local x2APIC NMI", /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */
241 "Generic Interrupt Controller", /* ACPI_MADT_GENERIC_INTERRUPT */
242 "Generic Interrupt Distributor", /* ACPI_MADT_GENERIC_DISTRIBUTOR */
243 "Generic MSI Frame", /* ACPI_MADT_GENERIC_MSI_FRAME */
244 "Generic Interrupt Redistributor", /* ACPI_MADT_GENERIC_REDISTRIBUTOR */
245 "Generic Interrupt Translator", /* ACPI_MADT_GENERIC_TRANSLATOR */
246 "Mutiprocessor Wakeup", /* ACPI_MADT_TYPE_MULTIPROC_WAKEUP */
247 "Unknown Subtable Type" /* Reserved */
248 };
249
250 static const char *AcpiDmNfitSubnames[] =
251 {
252 "System Physical Address Range", /* ACPI_NFIT_TYPE_SYSTEM_ADDRESS */
253 "Memory Range Map", /* ACPI_NFIT_TYPE_MEMORY_MAP */
254 "Interleave Info", /* ACPI_NFIT_TYPE_INTERLEAVE */
255 "SMBIOS Information", /* ACPI_NFIT_TYPE_SMBIOS */
256 "NVDIMM Control Region", /* ACPI_NFIT_TYPE_CONTROL_REGION */
257 "NVDIMM Block Data Window Region", /* ACPI_NFIT_TYPE_DATA_REGION */
258 "Flush Hint Address", /* ACPI_NFIT_TYPE_FLUSH_ADDRESS */
259 "Platform Capabilities", /* ACPI_NFIT_TYPE_CAPABILITIES */
260 "Unknown Subtable Type" /* Reserved */
261 };
262
263 static const char *AcpiDmPcctSubnames[] =
264 {
265 "Generic Communications Subspace", /* ACPI_PCCT_TYPE_GENERIC_SUBSPACE */
266 "HW-Reduced Comm Subspace", /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE */
267 "HW-Reduced Comm Subspace Type2", /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 */
268 "Extended PCC Master Subspace", /* ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE */
269 "Extended PCC Slave Subspace", /* ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE */
270 "HW Registers based Comm Subspace", /* ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE */
271 "Unknown Subtable Type" /* Reserved */
272 };
273
274 static const char *AcpiDmPhatSubnames[] =
275 {
276 "Firmware Version Data", /* ACPI_PHAT_TYPE_FW_VERSION_DATA */
277 "Firmware Health Data", /* ACPI_PHAT_TYPE_FW_HEALTH_DATA */
278 "Unknown Subtable Type" /* Reserved */
279 };
280
281 static const char *AcpiDmPmttSubnames[] =
282 {
283 "Socket", /* ACPI_PMTT_TYPE_SOCKET */
284 "Memory Controller", /* ACPI_PMTT_TYPE_CONTROLLER */
285 "Physical Component (DIMM)", /* ACPI_PMTT_TYPE_DIMM */
286 "Unknown Subtable Type", /* Reserved */
287 "Vendor Specific" /* ACPI_PMTT_TYPE_VENDOR */
288 };
289
290 static const char *AcpiDmPpttSubnames[] =
291 {
292 "Processor Hierarchy Node", /* ACPI_PPTT_TYPE_PROCESSOR */
293 "Cache Type", /* ACPI_PPTT_TYPE_CACHE */
294 "ID", /* ACPI_PPTT_TYPE_ID */
295 "Unknown Subtable Type" /* Reserved */
296 };
297
298 static const char *AcpiDmRgrtSubnames[] =
299 {
300 "Unknown/Reserved Image Type", /* ACPI_RGRT_TYPE_RESERVED0 */
301 "Type PNG" /* ACPI_RGRT_IMAGE_TYPE_PNG */
302 };
303
304 static const char *AcpiDmSdevSubnames[] =
305 {
306 "Namespace Device", /* ACPI_SDEV_TYPE_NAMESPACE_DEVICE */
307 "PCIe Endpoint Device", /* ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE */
308 "Unknown Subtable Type" /* Reserved */
309 };
310
311 static const char *AcpiDmSratSubnames[] =
312 {
313 "Processor Local APIC/SAPIC Affinity",
314 "Memory Affinity",
315 "Processor Local x2APIC Affinity",
316 "GICC Affinity",
317 "GIC ITS Affinity", /* Acpi 6.2 */
318 "Generic Initiator Affinity", /* Acpi 6.3 */
319 "Unknown Subtable Type" /* Reserved */
320 };
321
322 static const char *AcpiDmTpm2Subnames[] =
323 {
324 "Illegal Start Method value",
325 "Reserved",
326 "ACPI Start Method",
327 "Reserved",
328 "Reserved",
329 "Reserved",
330 "Memory Mapped I/O",
331 "Command Response Buffer",
332 "Command Response Buffer with ACPI Start Method",
333 "Reserved",
334 "Reserved",
335 "Command Response Buffer with ARM SMC",
336 "Unknown Subtable Type" /* Reserved */
337 };
338
339 static const char *AcpiDmIvrsSubnames[] =
340 {
341 "Hardware Definition Block (IVHD)",
342 "Hardware Definition Block - Mixed Format (IVHD)",
343 "Memory Definition Block (IVMD)",
344 "Unknown/Reserved Subtable Type" /* Reserved */
345 };
346
347 static const char *AcpiDmIvrsDevEntryNames[] =
348 {
349 "Unknown/Reserved Device Entry Type", /* 0- Reserved */
350 "Device Entry: Select All Devices", /* 1 */
351 "Device Entry: Select One Device", /* 2 */
352 "Device Entry: Start of Range", /* 3 */
353 "Device Entry: End of Range", /* 4 */
354 "Device Entry: Alias Select", /* 66 */
355 "Device Entry: Alias Start of Range", /* 67 */
356 "Unknown/Reserved Device Entry Type", /* 68- Reserved */
357 "Unknown/Reserved Device Entry Type", /* 69- Reserved */
358 "Device Entry: Extended Select", /* 70 */
359 "Device Entry: Extended Start of Range", /* 71 */
360 "Device Entry: Special Device", /* 72 */
361 "Device Entry: ACPI HID Named Device", /* 240 */
362 "Unknown/Reserved Device Entry Type" /* Reserved */
363 };
364
365 static const char *AcpiDmLpitSubnames[] =
366 {
367 "Native C-state Idle Structure",
368 "Unknown Subtable Type" /* Reserved */
369 };
370
371 static const char *AcpiDmViotSubnames[] =
372 {
373 "Unknown Subtable Type", /* 0 -Reserved */
374 "PCI Range",
375 "MMIO Endpoint",
376 "VirtIO-PCI IOMMU",
377 "VirtIO-MMIO IOMMU",
378 "Unknown Subtable Type" /* Reserved */
379 };
380
381 #define ACPI_FADT_PM_RESERVED 9
382
383 static const char *AcpiDmFadtProfiles[] =
384 {
385 "Unspecified",
386 "Desktop",
387 "Mobile",
388 "Workstation",
389 "Enterprise Server",
390 "SOHO Server",
391 "Appliance PC",
392 "Performance Server",
393 "Tablet",
394 "Unknown Profile Type"
395 };
396
397 #define ACPI_GAS_WIDTH_RESERVED 5
398
399 static const char *AcpiDmGasAccessWidth[] =
400 {
401 "Undefined/Legacy",
402 "Byte Access:8",
403 "Word Access:16",
404 "DWord Access:32",
405 "QWord Access:64",
406 "Unknown Width Encoding"
407 };
408
409
410 /*******************************************************************************
411 *
412 * ACPI Table Data, indexed by signature.
413 *
414 * Each entry contains: Signature, Table Info, Handler, DtHandler,
415 * Template, Description
416 *
417 * Simple tables have only a TableInfo structure, complex tables have a
418 * handler. This table must be NULL terminated. RSDP and FACS are
419 * special-cased elsewhere.
420 *
421 * Note: Any tables added here should be duplicated within
422 * AcpiGbl_SupportedTables in the file common/ahtable.c
423 *
424 ******************************************************************************/
425
426 const ACPI_DMTABLE_DATA AcpiDmTableData[] =
427 {
428 {ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, DtCompileAsf, TemplateAsf},
429 {ACPI_SIG_BDAT, AcpiDmTableInfoBdat, NULL, NULL, TemplateBdat},
430 {ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert},
431 {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt, NULL, NULL, TemplateBgrt},
432 {ACPI_SIG_BOOT, AcpiDmTableInfoBoot, NULL, NULL, TemplateBoot},
433 {ACPI_SIG_CEDT, NULL, AcpiDmDumpCedt, DtCompileCedt, TemplateCedt},
434 {ACPI_SIG_CPEP, NULL, AcpiDmDumpCpep, DtCompileCpep, TemplateCpep},
435 {ACPI_SIG_CSRT, NULL, AcpiDmDumpCsrt, DtCompileCsrt, TemplateCsrt},
436 {ACPI_SIG_DBG2, AcpiDmTableInfoDbg2, AcpiDmDumpDbg2, DtCompileDbg2, TemplateDbg2},
437 {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp, NULL, NULL, TemplateDbgp},
438 {ACPI_SIG_DMAR, NULL, AcpiDmDumpDmar, DtCompileDmar, TemplateDmar},
439 {ACPI_SIG_DRTM, NULL, AcpiDmDumpDrtm, DtCompileDrtm, TemplateDrtm},
440 {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt, NULL, NULL, TemplateEcdt},
441 {ACPI_SIG_EINJ, NULL, AcpiDmDumpEinj, DtCompileEinj, TemplateEinj},
442 {ACPI_SIG_ERST, NULL, AcpiDmDumpErst, DtCompileErst, TemplateErst},
443 {ACPI_SIG_FADT, NULL, AcpiDmDumpFadt, DtCompileFadt, TemplateFadt},
444 {ACPI_SIG_FPDT, NULL, AcpiDmDumpFpdt, DtCompileFpdt, TemplateFpdt},
445 {ACPI_SIG_GTDT, NULL, AcpiDmDumpGtdt, DtCompileGtdt, TemplateGtdt},
446 {ACPI_SIG_HEST, NULL, AcpiDmDumpHest, DtCompileHest, TemplateHest},
447 {ACPI_SIG_HMAT, NULL, AcpiDmDumpHmat, DtCompileHmat, TemplateHmat},
448 {ACPI_SIG_HPET, AcpiDmTableInfoHpet, NULL, NULL, TemplateHpet},
449 {ACPI_SIG_IORT, NULL, AcpiDmDumpIort, DtCompileIort, TemplateIort},
450 {ACPI_SIG_IVRS, NULL, AcpiDmDumpIvrs, DtCompileIvrs, TemplateIvrs},
451 {ACPI_SIG_LPIT, NULL, AcpiDmDumpLpit, DtCompileLpit, TemplateLpit},
452 {ACPI_SIG_MADT, NULL, AcpiDmDumpMadt, DtCompileMadt, TemplateMadt},
453 {ACPI_SIG_MCFG, NULL, AcpiDmDumpMcfg, DtCompileMcfg, TemplateMcfg},
454 {ACPI_SIG_MCHI, AcpiDmTableInfoMchi, NULL, NULL, TemplateMchi},
455 {ACPI_SIG_MPST, AcpiDmTableInfoMpst, AcpiDmDumpMpst, DtCompileMpst, TemplateMpst},
456 {ACPI_SIG_MSCT, NULL, AcpiDmDumpMsct, DtCompileMsct, TemplateMsct},
457 {ACPI_SIG_MSDM, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateMsdm},
458 {ACPI_SIG_NFIT, AcpiDmTableInfoNfit, AcpiDmDumpNfit, DtCompileNfit, TemplateNfit},
459 {ACPI_SIG_PCCT, AcpiDmTableInfoPcct, AcpiDmDumpPcct, DtCompilePcct, TemplatePcct},
460 {ACPI_SIG_PDTT, AcpiDmTableInfoPdtt, AcpiDmDumpPdtt, DtCompilePdtt, TemplatePdtt},
461 {ACPI_SIG_PHAT, NULL, AcpiDmDumpPhat, DtCompilePhat, TemplatePhat},
462 {ACPI_SIG_PMTT, NULL, AcpiDmDumpPmtt, DtCompilePmtt, TemplatePmtt},
463 {ACPI_SIG_PPTT, NULL, AcpiDmDumpPptt, DtCompilePptt, TemplatePptt},
464 {ACPI_SIG_PRMT, NULL, AcpiDmDumpPrmt, DtCompilePrmt, TemplatePrmt},
465 {ACPI_SIG_RASF, AcpiDmTableInfoRasf, NULL, NULL, TemplateRasf},
466 {ACPI_SIG_RGRT, NULL, AcpiDmDumpRgrt, DtCompileRgrt, TemplateRgrt},
467 {ACPI_SIG_RSDT, NULL, AcpiDmDumpRsdt, DtCompileRsdt, TemplateRsdt},
468 {ACPI_SIG_S3PT, NULL, NULL, NULL, TemplateS3pt},
469 {ACPI_SIG_SBST, AcpiDmTableInfoSbst, NULL, NULL, TemplateSbst},
470 {ACPI_SIG_SDEI, AcpiDmTableInfoSdei, NULL, NULL, TemplateSdei},
471 {ACPI_SIG_SDEV, AcpiDmTableInfoSdev, AcpiDmDumpSdev, DtCompileSdev, TemplateSdev},
472 {ACPI_SIG_SLIC, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateSlic},
473 {ACPI_SIG_SLIT, NULL, AcpiDmDumpSlit, DtCompileSlit, TemplateSlit},
474 {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr, NULL, NULL, TemplateSpcr},
475 {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi, NULL, NULL, TemplateSpmi},
476 {ACPI_SIG_SRAT, NULL, AcpiDmDumpSrat, DtCompileSrat, TemplateSrat},
477 {ACPI_SIG_STAO, NULL, AcpiDmDumpStao, DtCompileStao, TemplateStao},
478 {ACPI_SIG_SVKL, AcpiDmTableInfoSvkl, AcpiDmDumpSvkl, DtCompileSvkl, TemplateSvkl},
479 {ACPI_SIG_TCPA, NULL, AcpiDmDumpTcpa, DtCompileTcpa, TemplateTcpa},
480 {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2, AcpiDmDumpTpm2, DtCompileTpm2, TemplateTpm2},
481 {ACPI_SIG_UEFI, AcpiDmTableInfoUefi, NULL, DtCompileUefi, TemplateUefi},
482 {ACPI_SIG_VIOT, AcpiDmTableInfoViot, AcpiDmDumpViot, DtCompileViot, TemplateViot},
483 {ACPI_SIG_WAET, AcpiDmTableInfoWaet, NULL, NULL, TemplateWaet},
484 {ACPI_SIG_WDAT, NULL, AcpiDmDumpWdat, DtCompileWdat, TemplateWdat},
485 {ACPI_SIG_WDDT, AcpiDmTableInfoWddt, NULL, NULL, TemplateWddt},
486 {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt, NULL, NULL, TemplateWdrt},
487 {ACPI_SIG_WPBT, NULL, AcpiDmDumpWpbt, DtCompileWpbt, TemplateWpbt},
488 {ACPI_SIG_WSMT, AcpiDmTableInfoWsmt, NULL, NULL, TemplateWsmt},
489 {ACPI_SIG_XENV, AcpiDmTableInfoXenv, NULL, NULL, TemplateXenv},
490 {ACPI_SIG_XSDT, NULL, AcpiDmDumpXsdt, DtCompileXsdt, TemplateXsdt},
491 {NULL, NULL, NULL, NULL, NULL}
492 };
493
494
495 /*******************************************************************************
496 *
497 * FUNCTION: AcpiDmGenerateChecksum
498 *
499 * PARAMETERS: Table - Pointer to table to be checksummed
500 * Length - Length of the table
501 * OriginalChecksum - Value of the checksum field
502 *
503 * RETURN: 8 bit checksum of buffer
504 *
505 * DESCRIPTION: Computes an 8 bit checksum of the table.
506 *
507 ******************************************************************************/
508
509 UINT8
510 AcpiDmGenerateChecksum (
511 void *Table,
512 UINT32 Length,
513 UINT8 OriginalChecksum)
514 {
515 UINT8 Checksum;
516
517
518 /* Sum the entire table as-is */
519
520 Checksum = AcpiTbChecksum ((UINT8 *) Table, Length);
521
522 /* Subtract off the existing checksum value in the table */
523
524 Checksum = (UINT8) (Checksum - OriginalChecksum);
525
526 /* Compute the final checksum */
527
528 Checksum = (UINT8) (0 - Checksum);
529 return (Checksum);
530 }
531
532
533 /*******************************************************************************
534 *
535 * FUNCTION: AcpiDmGetTableData
536 *
537 * PARAMETERS: Signature - ACPI signature (4 chars) to match
538 *
539 * RETURN: Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found.
540 *
541 * DESCRIPTION: Find a match in the global table of supported ACPI tables
542 *
543 ******************************************************************************/
544
545 const ACPI_DMTABLE_DATA *
546 AcpiDmGetTableData (
547 char *Signature)
548 {
549 const ACPI_DMTABLE_DATA *Info;
550
551
552 for (Info = AcpiDmTableData; Info->Signature; Info++)
553 {
554 if (ACPI_COMPARE_NAMESEG (Signature, Info->Signature))
555 {
556 return (Info);
557 }
558 }
559
560 return (NULL);
561 }
562
563
564 /*******************************************************************************
565 *
566 * FUNCTION: AcpiDmDumpDataTable
567 *
568 * PARAMETERS: Table - An ACPI table
569 *
570 * RETURN: None.
571 *
572 * DESCRIPTION: Format the contents of an ACPI data table (any table other
573 * than an SSDT or DSDT that does not contain executable AML code)
574 *
575 ******************************************************************************/
576
577 void
578 AcpiDmDumpDataTable (
579 ACPI_TABLE_HEADER *Table)
580 {
581 ACPI_STATUS Status;
582 const ACPI_DMTABLE_DATA *TableData;
583 UINT32 Length;
584
585
586 /* Ignore tables that contain AML */
587
588 if (AcpiUtIsAmlTable (Table))
589 {
590 if (AslGbl_VerboseTemplates)
591 {
592 /* Dump the raw table data */
593
594 Length = Table->Length;
595
596 AcpiOsPrintf ("\n/*\n%s: Length %d (0x%X)\n\n",
597 ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
598 AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
599 Length, DB_BYTE_DISPLAY, 0);
600 AcpiOsPrintf (" */\n");
601 }
602 return;
603 }
604
605 /*
606 * Handle tables that don't use the common ACPI table header structure.
607 * Currently, these are the FACS, RSDP, and S3PT.
608 */
609 if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_FACS))
610 {
611 Length = Table->Length;
612 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs);
613 if (ACPI_FAILURE (Status))
614 {
615 return;
616 }
617 }
618 else if (ACPI_VALIDATE_RSDP_SIG (Table->Signature))
619 {
620 Length = AcpiDmDumpRsdp (Table);
621 }
622 else if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_S3PT))
623 {
624 Length = AcpiDmDumpS3pt (Table);
625 }
626 else
627 {
628 /*
629 * All other tables must use the common ACPI table header, dump it now
630 */
631 Length = Table->Length;
632 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader);
633 if (ACPI_FAILURE (Status))
634 {
635 return;
636 }
637 AcpiOsPrintf ("\n");
638
639 /* Match signature and dispatch appropriately */
640
641 TableData = AcpiDmGetTableData (Table->Signature);
642 if (!TableData)
643 {
644 if (!strncmp (Table->Signature, "OEM", 3))
645 {
646 AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n",
647 Table->Signature);
648 }
649 else
650 {
651 AcpiOsPrintf ("\n**** Unknown ACPI table signature [%4.4s]\n\n",
652 Table->Signature);
653
654 fprintf (stderr, "Unknown ACPI table signature [%4.4s], ",
655 Table->Signature);
656
657 if (!AcpiGbl_ForceAmlDisassembly)
658 {
659 fprintf (stderr, "decoding ACPI table header only\n");
660 }
661 else
662 {
663 fprintf (stderr, "assuming table contains valid AML code\n");
664 }
665 }
666 }
667 else if (TableData->TableHandler)
668 {
669 /* Complex table, has a handler */
670
671 TableData->TableHandler (Table);
672 }
673 else if (TableData->TableInfo)
674 {
675 /* Simple table, just walk the info table */
676
677 Status = AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo);
678 if (ACPI_FAILURE (Status))
679 {
680 return;
681 }
682 }
683 }
684
685 if (!AslGbl_DoTemplates || AslGbl_VerboseTemplates)
686 {
687 /* Dump the raw table data */
688
689 AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n",
690 ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
691 AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
692 Length, DB_BYTE_DISPLAY, 0);
693 }
694 }
695
696
697 /*******************************************************************************
698 *
699 * FUNCTION: AcpiDmLineHeader
700 *
701 * PARAMETERS: Offset - Current byte offset, from table start
702 * ByteLength - Length of the field in bytes, 0 for flags
703 * Name - Name of this field
704 *
705 * RETURN: None
706 *
707 * DESCRIPTION: Utility routines for formatting output lines. Displays the
708 * current table offset in hex and decimal, the field length,
709 * and the field name.
710 *
711 ******************************************************************************/
712
713 void
714 AcpiDmLineHeader (
715 UINT32 Offset,
716 UINT32 ByteLength,
717 char *Name)
718 {
719
720 /* Allow a null name for fields that span multiple lines (large buffers) */
721
722 if (!Name)
723 {
724 Name = "";
725 }
726
727 if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */
728 {
729 if (ByteLength)
730 {
731 AcpiOsPrintf ("[%.4d] %34s : ", ByteLength, Name);
732 }
733 else
734 {
735 if (*Name)
736 {
737 AcpiOsPrintf ("%41s : ", Name);
738 }
739 else
740 {
741 AcpiOsPrintf ("%41s ", Name);
742 }
743 }
744 }
745 else /* Normal disassembler or verbose template */
746 {
747 if (ByteLength)
748 {
749 AcpiOsPrintf ("[%3.3Xh %4.4d% 4d] %28s : ",
750 Offset, Offset, ByteLength, Name);
751 }
752 else
753 {
754 if (*Name)
755 {
756 AcpiOsPrintf ("%44s : ", Name);
757 }
758 else
759 {
760 AcpiOsPrintf ("%44s ", Name);
761 }
762 }
763 }
764 }
765
766 void
767 AcpiDmLineHeader2 (
768 UINT32 Offset,
769 UINT32 ByteLength,
770 char *Name,
771 UINT32 Value)
772 {
773
774 if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */
775 {
776 if (ByteLength)
777 {
778 AcpiOsPrintf ("[%.4d] %30s %3d : ",
779 ByteLength, Name, Value);
780 }
781 else
782 {
783 AcpiOsPrintf ("%36s % 3d : ",
784 Name, Value);
785 }
786 }
787 else /* Normal disassembler or verbose template */
788 {
789 if (ByteLength)
790 {
791 AcpiOsPrintf ("[%3.3Xh %4.4d %3d] %24s %3d : ",
792 Offset, Offset, ByteLength, Name, Value);
793 }
794 else
795 {
796 AcpiOsPrintf ("[%3.3Xh %4.4d ] %24s %3d : ",
797 Offset, Offset, Name, Value);
798 }
799 }
800 }
801
802
803 /*******************************************************************************
804 *
805 * FUNCTION: AcpiDmDumpTable
806 *
807 * PARAMETERS: TableLength - Length of the entire ACPI table
808 * TableOffset - Starting offset within the table for this
809 * sub-descriptor (0 if main table)
810 * Table - The ACPI table
811 * SubtableLength - Length of this sub-descriptor
812 * Info - Info table for this ACPI table
813 *
814 * RETURN: Status
815 *
816 * DESCRIPTION: Display ACPI table contents by walking the Info table.
817 *
818 * Note: This function must remain in sync with DtGetFieldLength.
819 *
820 ******************************************************************************/
821
822 ACPI_STATUS
823 AcpiDmDumpTable (
824 UINT32 TableLength,
825 UINT32 TableOffset,
826 void *Table,
827 UINT32 SubtableLength,
828 ACPI_DMTABLE_INFO *Info)
829 {
830 UINT8 *Target;
831 UINT32 CurrentOffset;
832 UINT32 ByteLength;
833 UINT8 Temp8;
834 UINT16 Temp16;
835 UINT32 Temp32;
836 UINT64 Value;
837 const AH_TABLE *TableData;
838 const char *Name;
839 BOOLEAN LastOutputBlankLine = FALSE;
840 ACPI_STATUS Status;
841 char RepairedName[8];
842
843
844 if (!Info)
845 {
846 AcpiOsPrintf ("Display not implemented\n");
847 return (AE_NOT_IMPLEMENTED);
848 }
849
850 /* Walk entire Info table; Null name terminates */
851
852 for (; Info->Name; Info++)
853 {
854 /*
855 * Target points to the field within the ACPI Table. CurrentOffset is
856 * the offset of the field from the start of the main table.
857 */
858 Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset);
859 CurrentOffset = TableOffset + Info->Offset;
860
861 /* Check for beyond subtable end or (worse) beyond EOT */
862
863 if (SubtableLength && (Info->Offset >= SubtableLength))
864 {
865 AcpiOsPrintf (
866 "/**** ACPI subtable terminates early (Len %u) - "
867 "may be older version (dump table) */\n", SubtableLength);
868
869 /* Move on to next subtable */
870
871 return (AE_OK);
872 }
873
874 if (CurrentOffset >= TableLength)
875 {
876 AcpiOsPrintf (
877 "/**** ACPI table terminates "
878 "in the middle of a data structure! (dump table) */\n");
879 return (AE_BAD_DATA);
880 }
881
882 /* Generate the byte length for this field */
883
884 switch (Info->Opcode)
885 {
886 case ACPI_DMT_UINT8:
887 case ACPI_DMT_CHKSUM:
888 case ACPI_DMT_SPACEID:
889 case ACPI_DMT_ACCWIDTH:
890 case ACPI_DMT_CEDT:
891 case ACPI_DMT_IVRS:
892 case ACPI_DMT_IVRS_DE:
893 case ACPI_DMT_GTDT:
894 case ACPI_DMT_MADT:
895 case ACPI_DMT_PCCT:
896 case ACPI_DMT_PMTT:
897 case ACPI_DMT_PPTT:
898 case ACPI_DMT_RGRT:
899 case ACPI_DMT_SDEV:
900 case ACPI_DMT_SRAT:
901 case ACPI_DMT_ASF:
902 case ACPI_DMT_HESTNTYP:
903 case ACPI_DMT_FADTPM:
904 case ACPI_DMT_EINJACT:
905 case ACPI_DMT_EINJINST:
906 case ACPI_DMT_ERSTACT:
907 case ACPI_DMT_ERSTINST:
908 case ACPI_DMT_DMAR_SCOPE:
909 case ACPI_DMT_VIOT:
910
911 ByteLength = 1;
912 break;
913
914 case ACPI_DMT_UINT16:
915 case ACPI_DMT_DMAR:
916 case ACPI_DMT_HEST:
917 case ACPI_DMT_HMAT:
918 case ACPI_DMT_NFIT:
919 case ACPI_DMT_PHAT:
920
921 ByteLength = 2;
922 break;
923
924 case ACPI_DMT_UINT24:
925
926 ByteLength = 3;
927 break;
928
929 case ACPI_DMT_UINT32:
930 case ACPI_DMT_NAME4:
931 case ACPI_DMT_SIG:
932 case ACPI_DMT_LPIT:
933 case ACPI_DMT_TPM2:
934
935 ByteLength = 4;
936 break;
937
938 case ACPI_DMT_UINT40:
939
940 ByteLength = 5;
941 break;
942
943 case ACPI_DMT_UINT48:
944 case ACPI_DMT_NAME6:
945
946 ByteLength = 6;
947 break;
948
949 case ACPI_DMT_UINT56:
950 case ACPI_DMT_BUF7:
951
952 ByteLength = 7;
953 break;
954
955 case ACPI_DMT_UINT64:
956 case ACPI_DMT_NAME8:
957
958 ByteLength = 8;
959 break;
960
961 case ACPI_DMT_BUF10:
962
963 ByteLength = 10;
964 break;
965
966 case ACPI_DMT_BUF12:
967
968 ByteLength = 12;
969 break;
970
971 case ACPI_DMT_BUF16:
972 case ACPI_DMT_UUID:
973
974 ByteLength = 16;
975 break;
976
977 case ACPI_DMT_BUF128:
978
979 ByteLength = 128;
980 break;
981
982 case ACPI_DMT_UNICODE:
983 case ACPI_DMT_BUFFER:
984 case ACPI_DMT_RAW_BUFFER:
985
986 ByteLength = SubtableLength;
987 break;
988
989 case ACPI_DMT_PMTT_VENDOR:
990 /*
991 * Calculate the length of the vendor data for the PMTT table:
992 * Length = (Current Subtable ptr + Subtable length) -
993 * Start of the vendor data (Target)
994 */
995 ByteLength = ((ACPI_CAST_PTR (char, Table) +
996 (ACPI_CAST_PTR (ACPI_PMTT_HEADER, Table)->Length)) -
997 ACPI_CAST_PTR (char, Target));
998 break;
999
1000 case ACPI_DMT_STRING:
1001
1002 ByteLength = strlen (ACPI_CAST_PTR (char, Target)) + 1;
1003 break;
1004
1005 case ACPI_DMT_IVRS_UNTERMINATED_STRING:
1006
1007 ByteLength = ((ACPI_CAST_PTR (ACPI_IVRS_DEVICE_HID, Target) -1)->UidLength);
1008 break;
1009
1010 case ACPI_DMT_GAS:
1011
1012 if (!LastOutputBlankLine)
1013 {
1014 AcpiOsPrintf ("\n");
1015 LastOutputBlankLine = TRUE;
1016 }
1017
1018 ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
1019 break;
1020
1021 case ACPI_DMT_HESTNTFY:
1022
1023 if (!LastOutputBlankLine)
1024 {
1025 AcpiOsPrintf ("\n");
1026 LastOutputBlankLine = TRUE;
1027 }
1028
1029 ByteLength = sizeof (ACPI_HEST_NOTIFY);
1030 break;
1031
1032 case ACPI_DMT_IORTMEM:
1033
1034 if (!LastOutputBlankLine)
1035 {
1036 LastOutputBlankLine = FALSE;
1037 }
1038
1039 ByteLength = sizeof (ACPI_IORT_MEMORY_ACCESS);
1040 break;
1041
1042 default:
1043
1044 ByteLength = 0;
1045 break;
1046 }
1047
1048 /* Check if we are beyond a subtable, or (worse) beyond EOT */
1049
1050 if (CurrentOffset + ByteLength > TableLength)
1051 {
1052 if (SubtableLength)
1053 {
1054 AcpiOsPrintf (
1055 "/**** ACPI subtable terminates early - "
1056 "may be older version (dump table) */\n");
1057
1058 /* Move on to next subtable */
1059
1060 return (AE_OK);
1061 }
1062
1063 AcpiOsPrintf (
1064 "/**** ACPI table terminates "
1065 "in the middle of a data structure! */\n");
1066 return (AE_BAD_DATA);
1067 }
1068
1069 if (Info->Opcode == ACPI_DMT_EXTRA_TEXT)
1070 {
1071 AcpiOsPrintf ("%s", Info->Name);
1072 continue;
1073 }
1074
1075 /* Start a new line and decode the opcode */
1076
1077 AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name);
1078
1079 switch (Info->Opcode)
1080 {
1081 /* Single-bit Flag fields. Note: Opcode is the bit position */
1082
1083 case ACPI_DMT_FLAG0:
1084 case ACPI_DMT_FLAG1:
1085 case ACPI_DMT_FLAG2:
1086 case ACPI_DMT_FLAG3:
1087 case ACPI_DMT_FLAG4:
1088 case ACPI_DMT_FLAG5:
1089 case ACPI_DMT_FLAG6:
1090 case ACPI_DMT_FLAG7:
1091
1092 AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01);
1093 break;
1094
1095 /* 2-bit Flag fields */
1096
1097 case ACPI_DMT_FLAGS0:
1098
1099 AcpiOsPrintf ("%1.1X\n", *Target & 0x03);
1100 break;
1101
1102 case ACPI_DMT_FLAGS1:
1103
1104 AcpiOsPrintf ("%1.1X\n", (*Target >> 1) & 0x03);
1105 break;
1106
1107 case ACPI_DMT_FLAGS2:
1108
1109 AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03);
1110 break;
1111
1112 case ACPI_DMT_FLAGS4:
1113
1114 AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03);
1115 break;
1116
1117 case ACPI_DMT_FLAGS4_0:
1118
1119 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target) & 0x0F);
1120 break;
1121
1122 case ACPI_DMT_FLAGS4_4:
1123
1124 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 4) & 0x0F);
1125 break;
1126
1127 case ACPI_DMT_FLAGS4_8:
1128
1129 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 8) & 0x0F);
1130 break;
1131
1132 case ACPI_DMT_FLAGS4_12:
1133
1134 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 12) & 0x0F);
1135 break;
1136
1137 case ACPI_DMT_FLAGS16_16:
1138
1139 AcpiOsPrintf ("%4.4X\n", (*(UINT32 *)Target >> 16) & 0xFFFF);
1140 break;
1141
1142 /* Integer Data Types */
1143
1144 case ACPI_DMT_UINT8:
1145 case ACPI_DMT_UINT16:
1146 case ACPI_DMT_UINT24:
1147 case ACPI_DMT_UINT32:
1148 case ACPI_DMT_UINT40:
1149 case ACPI_DMT_UINT48:
1150 case ACPI_DMT_UINT56:
1151 case ACPI_DMT_UINT64:
1152 /*
1153 * Dump bytes - high byte first, low byte last.
1154 * Note: All ACPI tables are little-endian.
1155 */
1156 Value = 0;
1157 for (Temp8 = (UINT8) ByteLength; Temp8 > 0; Temp8--)
1158 {
1159 AcpiOsPrintf ("%2.2X", Target[Temp8 - 1]);
1160 Value |= Target[Temp8 - 1];
1161 Value <<= 8;
1162 }
1163
1164 if (!Value && (Info->Flags & DT_DESCRIBES_OPTIONAL))
1165 {
1166 AcpiOsPrintf (" [Optional field not present]");
1167 }
1168
1169 AcpiOsPrintf ("\n");
1170 break;
1171
1172 case ACPI_DMT_BUF7:
1173 case ACPI_DMT_BUF10:
1174 case ACPI_DMT_BUF12:
1175 case ACPI_DMT_BUF16:
1176 case ACPI_DMT_BUF128:
1177 /*
1178 * Buffer: Size depends on the opcode and was set above.
1179 * Each hex byte is separated with a space.
1180 * Multiple lines are separated by line continuation char.
1181 */
1182 for (Temp16 = 0; Temp16 < ByteLength; Temp16++)
1183 {
1184 AcpiOsPrintf ("%2.2X", Target[Temp16]);
1185 if ((UINT32) (Temp16 + 1) < ByteLength)
1186 {
1187 if ((Temp16 > 0) && (!((Temp16+1) % 16)))
1188 {
1189 AcpiOsPrintf (" \\\n"); /* Line continuation */
1190 AcpiDmLineHeader (0, 0, NULL);
1191 }
1192 else
1193 {
1194 AcpiOsPrintf (" ");
1195 }
1196 }
1197 }
1198
1199 AcpiOsPrintf ("\n");
1200 break;
1201
1202 case ACPI_DMT_UUID:
1203
1204 /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */
1205
1206 (void) AcpiUtConvertUuidToString ((char *) Target, AslGbl_MsgBuffer);
1207
1208 AcpiOsPrintf ("%s\n", AslGbl_MsgBuffer);
1209 break;
1210
1211 case ACPI_DMT_STRING:
1212
1213 AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target));
1214 break;
1215
1216 case ACPI_DMT_IVRS_UNTERMINATED_STRING:
1217
1218 AcpiOsPrintf ("\"%.*s\"\n", ByteLength, ACPI_CAST_PTR (char, Target));
1219 break;
1220
1221 /* Fixed length ASCII name fields */
1222
1223 case ACPI_DMT_SIG:
1224
1225 AcpiUtCheckAndRepairAscii (Target, RepairedName, 4);
1226 AcpiOsPrintf ("\"%.4s\" ", RepairedName);
1227
1228 TableData = AcpiAhGetTableInfo (ACPI_CAST_PTR (char, Target));
1229 if (TableData)
1230 {
1231 AcpiOsPrintf (STRING_FORMAT, TableData->Description);
1232 }
1233 else
1234 {
1235 AcpiOsPrintf ("\n");
1236 }
1237 break;
1238
1239 case ACPI_DMT_NAME4:
1240
1241 AcpiUtCheckAndRepairAscii (Target, RepairedName, 4);
1242 AcpiOsPrintf ("\"%.4s\"\n", RepairedName);
1243 break;
1244
1245 case ACPI_DMT_NAME6:
1246
1247 AcpiUtCheckAndRepairAscii (Target, RepairedName, 6);
1248 AcpiOsPrintf ("\"%.6s\"\n", RepairedName);
1249 break;
1250
1251 case ACPI_DMT_NAME8:
1252
1253 AcpiUtCheckAndRepairAscii (Target, RepairedName, 8);
1254 AcpiOsPrintf ("\"%.8s\"\n", RepairedName);
1255 break;
1256
1257 /* Special Data Types */
1258
1259 case ACPI_DMT_CHKSUM:
1260
1261 /* Checksum, display and validate */
1262
1263 AcpiOsPrintf ("%2.2X", *Target);
1264 Temp8 = AcpiDmGenerateChecksum (Table,
1265 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
1266 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum);
1267
1268 if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
1269 {
1270 AcpiOsPrintf (
1271 " /* Incorrect checksum, should be %2.2X */", Temp8);
1272 }
1273
1274 AcpiOsPrintf ("\n");
1275 break;
1276
1277 case ACPI_DMT_SPACEID:
1278
1279 /* Address Space ID */
1280
1281 AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target));
1282 break;
1283
1284 case ACPI_DMT_ACCWIDTH:
1285
1286 /* Encoded Access Width */
1287
1288 Temp8 = *Target;
1289 if (Temp8 > ACPI_GAS_WIDTH_RESERVED)
1290 {
1291 Temp8 = ACPI_GAS_WIDTH_RESERVED;
1292 }
1293
1294 AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmGasAccessWidth[Temp8]);
1295 break;
1296
1297 case ACPI_DMT_GAS:
1298
1299 /* Generic Address Structure */
1300
1301 AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure");
1302 Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1303 sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas);
1304 if (ACPI_FAILURE (Status))
1305 {
1306 return (Status);
1307 }
1308
1309 AcpiOsPrintf ("\n");
1310 LastOutputBlankLine = TRUE;
1311 break;
1312
1313 case ACPI_DMT_ASF:
1314
1315 /* ASF subtable types */
1316
1317 Temp16 = (UINT16) ((*Target) & 0x7F); /* Top bit can be zero or one */
1318 if (Temp16 > ACPI_ASF_TYPE_RESERVED)
1319 {
1320 Temp16 = ACPI_ASF_TYPE_RESERVED;
1321 }
1322
1323 AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]);
1324 break;
1325
1326 case ACPI_DMT_CEDT:
1327
1328 /* CEDT subtable types */
1329
1330 Temp8 = *Target;
1331 if (Temp8 > ACPI_CEDT_TYPE_RESERVED)
1332 {
1333 Temp8 = ACPI_CEDT_TYPE_RESERVED;
1334 }
1335
1336 AcpiOsPrintf (UINT8_FORMAT, *Target,
1337 AcpiDmCedtSubnames[Temp8]);
1338 break;
1339
1340 case ACPI_DMT_DMAR:
1341
1342 /* DMAR subtable types */
1343
1344 Temp16 = ACPI_GET16 (Target);
1345 if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
1346 {
1347 Temp16 = ACPI_DMAR_TYPE_RESERVED;
1348 }
1349
1350 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1351 AcpiDmDmarSubnames[Temp16]);
1352 break;
1353
1354 case ACPI_DMT_DMAR_SCOPE:
1355
1356 /* DMAR device scope types */
1357
1358 Temp8 = *Target;
1359 if (Temp8 > ACPI_DMAR_SCOPE_TYPE_RESERVED)
1360 {
1361 Temp8 = ACPI_DMAR_SCOPE_TYPE_RESERVED;
1362 }
1363
1364 AcpiOsPrintf (UINT8_FORMAT, *Target,
1365 AcpiDmDmarScope[Temp8]);
1366 break;
1367
1368 case ACPI_DMT_EINJACT:
1369
1370 /* EINJ Action types */
1371
1372 Temp8 = *Target;
1373 if (Temp8 > ACPI_EINJ_ACTION_RESERVED)
1374 {
1375 Temp8 = ACPI_EINJ_ACTION_RESERVED;
1376 }
1377
1378 AcpiOsPrintf (UINT8_FORMAT, *Target,
1379 AcpiDmEinjActions[Temp8]);
1380 break;
1381
1382 case ACPI_DMT_EINJINST:
1383
1384 /* EINJ Instruction types */
1385
1386 Temp8 = *Target;
1387 if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED)
1388 {
1389 Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED;
1390 }
1391
1392 AcpiOsPrintf (UINT8_FORMAT, *Target,
1393 AcpiDmEinjInstructions[Temp8]);
1394 break;
1395
1396 case ACPI_DMT_ERSTACT:
1397
1398 /* ERST Action types */
1399
1400 Temp8 = *Target;
1401 if (Temp8 > ACPI_ERST_ACTION_RESERVED)
1402 {
1403 Temp8 = ACPI_ERST_ACTION_RESERVED;
1404 }
1405
1406 AcpiOsPrintf (UINT8_FORMAT, *Target,
1407 AcpiDmErstActions[Temp8]);
1408 break;
1409
1410 case ACPI_DMT_ERSTINST:
1411
1412 /* ERST Instruction types */
1413
1414 Temp8 = *Target;
1415 if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED)
1416 {
1417 Temp8 = ACPI_ERST_INSTRUCTION_RESERVED;
1418 }
1419
1420 AcpiOsPrintf (UINT8_FORMAT, *Target,
1421 AcpiDmErstInstructions[Temp8]);
1422 break;
1423
1424 case ACPI_DMT_GTDT:
1425
1426 /* GTDT subtable types */
1427
1428 Temp8 = *Target;
1429 if (Temp8 > ACPI_GTDT_TYPE_RESERVED)
1430 {
1431 Temp8 = ACPI_GTDT_TYPE_RESERVED;
1432 }
1433
1434 AcpiOsPrintf (UINT8_FORMAT, *Target,
1435 AcpiDmGtdtSubnames[Temp8]);
1436 break;
1437
1438 case ACPI_DMT_HEST:
1439
1440 /* HEST subtable types */
1441
1442 Temp16 = ACPI_GET16 (Target);
1443 if (Temp16 > ACPI_HEST_TYPE_RESERVED)
1444 {
1445 Temp16 = ACPI_HEST_TYPE_RESERVED;
1446 }
1447
1448 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1449 AcpiDmHestSubnames[Temp16]);
1450 break;
1451
1452 case ACPI_DMT_HESTNTFY:
1453
1454 AcpiOsPrintf (STRING_FORMAT,
1455 "Hardware Error Notification Structure");
1456
1457 Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1458 sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify);
1459 if (ACPI_FAILURE (Status))
1460 {
1461 return (Status);
1462 }
1463
1464 AcpiOsPrintf ("\n");
1465 LastOutputBlankLine = TRUE;
1466 break;
1467
1468 case ACPI_DMT_HESTNTYP:
1469
1470 /* HEST Notify types */
1471
1472 Temp8 = *Target;
1473 if (Temp8 > ACPI_HEST_NOTIFY_RESERVED)
1474 {
1475 Temp8 = ACPI_HEST_NOTIFY_RESERVED;
1476 }
1477
1478 AcpiOsPrintf (UINT8_FORMAT, *Target,
1479 AcpiDmHestNotifySubnames[Temp8]);
1480 break;
1481
1482 case ACPI_DMT_HMAT:
1483
1484 /* HMAT subtable types */
1485
1486 Temp16 = *Target;
1487 if (Temp16 > ACPI_HMAT_TYPE_RESERVED)
1488 {
1489 Temp16 = ACPI_HMAT_TYPE_RESERVED;
1490 }
1491
1492 AcpiOsPrintf (UINT16_FORMAT, *Target,
1493 AcpiDmHmatSubnames[Temp16]);
1494 break;
1495
1496 case ACPI_DMT_IORTMEM:
1497
1498 AcpiOsPrintf (STRING_FORMAT,
1499 "IORT Memory Access Properties");
1500
1501 Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1502 sizeof (ACPI_IORT_MEMORY_ACCESS), AcpiDmTableInfoIortAcc);
1503 if (ACPI_FAILURE (Status))
1504 {
1505 return (Status);
1506 }
1507
1508 LastOutputBlankLine = TRUE;
1509 break;
1510
1511 case ACPI_DMT_MADT:
1512
1513 /* MADT subtable types */
1514
1515 Temp8 = *Target;
1516 if (Temp8 > ACPI_MADT_TYPE_RESERVED)
1517 {
1518 Temp8 = ACPI_MADT_TYPE_RESERVED;
1519 }
1520
1521 AcpiOsPrintf (UINT8_FORMAT, *Target,
1522 AcpiDmMadtSubnames[Temp8]);
1523 break;
1524
1525 case ACPI_DMT_NFIT:
1526
1527 /* NFIT subtable types */
1528
1529 Temp16 = ACPI_GET16 (Target);
1530 if (Temp16 > ACPI_NFIT_TYPE_RESERVED)
1531 {
1532 Temp16 = ACPI_NFIT_TYPE_RESERVED;
1533 }
1534
1535 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1536 AcpiDmNfitSubnames[Temp16]);
1537 break;
1538
1539 case ACPI_DMT_PCCT:
1540
1541 /* PCCT subtable types */
1542
1543 Temp8 = *Target;
1544 if (Temp8 > ACPI_PCCT_TYPE_RESERVED)
1545 {
1546 Temp8 = ACPI_PCCT_TYPE_RESERVED;
1547 }
1548
1549 AcpiOsPrintf (UINT8_FORMAT, *Target,
1550 AcpiDmPcctSubnames[Temp8]);
1551 break;
1552
1553 case ACPI_DMT_PHAT:
1554
1555 /* PMTT subtable types */
1556
1557 Temp16 = *Target;
1558 if (Temp16 > ACPI_PHAT_TYPE_RESERVED)
1559 {
1560 Temp16 = ACPI_PHAT_TYPE_RESERVED;
1561 }
1562
1563 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16(Target),
1564 AcpiDmPhatSubnames[Temp16]);
1565 break;
1566
1567 case ACPI_DMT_PMTT:
1568
1569 /* PMTT subtable types */
1570
1571 Temp8 = *Target;
1572 if (Temp8 == ACPI_PMTT_TYPE_VENDOR)
1573 {
1574 Temp8 = ACPI_PMTT_TYPE_RESERVED + 1;
1575 }
1576 else if (Temp8 > ACPI_PMTT_TYPE_RESERVED)
1577 {
1578 Temp8 = ACPI_PMTT_TYPE_RESERVED;
1579 }
1580 AcpiOsPrintf (UINT8_FORMAT, *Target,
1581 AcpiDmPmttSubnames[Temp8]);
1582 break;
1583
1584 case ACPI_DMT_PPTT:
1585
1586 /* PPTT subtable types */
1587
1588 Temp8 = *Target;
1589 if (Temp8 > ACPI_PPTT_TYPE_RESERVED)
1590 {
1591 Temp8 = ACPI_PPTT_TYPE_RESERVED;
1592 }
1593
1594 AcpiOsPrintf (UINT8_FORMAT, *Target,
1595 AcpiDmPpttSubnames[Temp8]);
1596 break;
1597
1598 case ACPI_DMT_UNICODE:
1599
1600 if (ByteLength == 0)
1601 {
1602 AcpiOsPrintf ("/* Zero-length Data */\n");
1603 break;
1604 }
1605
1606 AcpiDmDumpUnicode (Table, CurrentOffset, ByteLength);
1607 break;
1608
1609 case ACPI_DMT_RAW_BUFFER:
1610 case ACPI_DMT_BUFFER:
1611 case ACPI_DMT_PMTT_VENDOR:
1612
1613 if (ByteLength == 0)
1614 {
1615 AcpiOsPrintf ("/* Zero-length Data */\n");
1616 break;
1617 }
1618
1619 AcpiDmDumpBuffer (Target, 0, ByteLength, 0, NULL);
1620 break;
1621
1622 case ACPI_DMT_RGRT:
1623
1624 /* RGRT subtable types */
1625
1626 Temp8 = *Target;
1627 if (Temp8 >= ACPI_RGRT_TYPE_RESERVED)
1628 {
1629 Temp8 = ACPI_RGRT_TYPE_RESERVED0;
1630 }
1631
1632 AcpiOsPrintf (UINT8_FORMAT, *Target,
1633 AcpiDmRgrtSubnames[Temp8]);
1634 break;
1635
1636 case ACPI_DMT_SDEV:
1637
1638 /* SDEV subtable types */
1639
1640 Temp8 = *Target;
1641 if (Temp8 > ACPI_SDEV_TYPE_RESERVED)
1642 {
1643 Temp8 = ACPI_SDEV_TYPE_RESERVED;
1644 }
1645
1646 AcpiOsPrintf (UINT8_FORMAT, *Target,
1647 AcpiDmSdevSubnames[Temp8]);
1648 break;
1649
1650 case ACPI_DMT_SRAT:
1651
1652 /* SRAT subtable types */
1653
1654 Temp8 = *Target;
1655 if (Temp8 > ACPI_SRAT_TYPE_RESERVED)
1656 {
1657 Temp8 = ACPI_SRAT_TYPE_RESERVED;
1658 }
1659
1660 AcpiOsPrintf (UINT8_FORMAT, *Target,
1661 AcpiDmSratSubnames[Temp8]);
1662 break;
1663
1664 case ACPI_DMT_TPM2:
1665
1666 /* TPM2 Start Method types */
1667
1668 Temp8 = *Target;
1669 if (Temp8 > ACPI_TPM2_RESERVED)
1670 {
1671 Temp8 = ACPI_TPM2_RESERVED;
1672 }
1673
1674 AcpiOsPrintf (UINT8_FORMAT, *Target,
1675 AcpiDmTpm2Subnames[Temp8]);
1676 break;
1677
1678
1679 case ACPI_DMT_FADTPM:
1680
1681 /* FADT Preferred PM Profile names */
1682
1683 Temp8 = *Target;
1684 if (Temp8 > ACPI_FADT_PM_RESERVED)
1685 {
1686 Temp8 = ACPI_FADT_PM_RESERVED;
1687 }
1688
1689 AcpiOsPrintf (UINT8_FORMAT, *Target,
1690 AcpiDmFadtProfiles[Temp8]);
1691 break;
1692
1693 case ACPI_DMT_IVRS:
1694
1695 /* IVRS subtable types */
1696
1697 Temp8 = *Target;
1698 switch (Temp8)
1699 {
1700 case ACPI_IVRS_TYPE_HARDWARE1:
1701 case ACPI_IVRS_TYPE_HARDWARE2:
1702
1703 Name = AcpiDmIvrsSubnames[0];
1704 break;
1705
1706 case ACPI_IVRS_TYPE_HARDWARE3:
1707
1708 Name = AcpiDmIvrsSubnames[1];
1709 break;
1710
1711 case ACPI_IVRS_TYPE_MEMORY1:
1712 case ACPI_IVRS_TYPE_MEMORY2:
1713 case ACPI_IVRS_TYPE_MEMORY3:
1714
1715 Name = AcpiDmIvrsSubnames[2];
1716 break;
1717
1718 default:
1719
1720 Name = AcpiDmIvrsSubnames[3];
1721 break;
1722 }
1723
1724 AcpiOsPrintf (UINT8_FORMAT, *Target, Name);
1725 break;
1726
1727 case ACPI_DMT_IVRS_DE:
1728
1729 /* IVRS device entry types */
1730
1731 Temp8 = *Target;
1732 switch (Temp8)
1733 {
1734 case ACPI_IVRS_TYPE_ALL:
1735 case ACPI_IVRS_TYPE_SELECT:
1736 case ACPI_IVRS_TYPE_START:
1737 case ACPI_IVRS_TYPE_END:
1738
1739 Name = AcpiDmIvrsDevEntryNames[Temp8];
1740 break;
1741
1742 case ACPI_IVRS_TYPE_ALIAS_SELECT:
1743 case ACPI_IVRS_TYPE_ALIAS_START:
1744 case ACPI_IVRS_TYPE_EXT_SELECT:
1745 case ACPI_IVRS_TYPE_EXT_START:
1746 case ACPI_IVRS_TYPE_SPECIAL:
1747
1748 Name = AcpiDmIvrsDevEntryNames[Temp8 - 61];
1749 break;
1750
1751 case ACPI_IVRS_TYPE_HID:
1752
1753 Name = AcpiDmIvrsDevEntryNames[Temp8 - 228];
1754 break;
1755
1756 default:
1757 Name = AcpiDmIvrsDevEntryNames[0]; /* Unknown/Reserved */
1758 break;
1759 }
1760
1761 AcpiOsPrintf (UINT8_FORMAT, *Target, Name);
1762 break;
1763
1764 case ACPI_DMT_LPIT:
1765
1766 /* LPIT subtable types */
1767
1768 Temp32 = ACPI_GET32 (Target);
1769 if (Temp32 > ACPI_LPIT_TYPE_RESERVED)
1770 {
1771 Temp32 = ACPI_LPIT_TYPE_RESERVED;
1772 }
1773
1774 AcpiOsPrintf (UINT32_FORMAT, ACPI_GET32 (Target),
1775 AcpiDmLpitSubnames[Temp32]);
1776 break;
1777
1778 case ACPI_DMT_VIOT:
1779
1780 /* VIOT subtable types */
1781
1782 Temp8 = *Target;
1783 if (Temp8 > ACPI_VIOT_RESERVED)
1784 {
1785 Temp8 = ACPI_VIOT_RESERVED;
1786 }
1787
1788 AcpiOsPrintf (UINT8_FORMAT, *Target,
1789 AcpiDmViotSubnames[Temp8]);
1790 break;
1791
1792 case ACPI_DMT_EXIT:
1793
1794 return (AE_OK);
1795
1796 default:
1797
1798 ACPI_ERROR ((AE_INFO,
1799 "**** Invalid table opcode [0x%X] ****\n", Info->Opcode));
1800 return (AE_SUPPORT);
1801 }
1802 }
1803
1804 if (TableOffset && !SubtableLength)
1805 {
1806 /*
1807 * If this table is not the main table, the subtable must have a
1808 * valid length
1809 */
1810 AcpiOsPrintf ("Invalid zero length subtable\n");
1811 return (AE_BAD_DATA);
1812 }
1813
1814 return (AE_OK);
1815 }
1816