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