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