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