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