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