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