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