1167802Sjkim/******************************************************************************
2167802Sjkim *
3167802Sjkim * Module Name: dmtable - Support for ACPI tables that contain no AML code
4167802Sjkim *
5167802Sjkim *****************************************************************************/
6167802Sjkim
7217365Sjkim/*
8217365Sjkim * Copyright (C) 2000 - 2011, Intel Corp.
9167802Sjkim * All rights reserved.
10167802Sjkim *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
25167802Sjkim *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
29167802Sjkim *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
43167802Sjkim
44193529Sjkim#include <contrib/dev/acpica/include/acpi.h>
45193529Sjkim#include <contrib/dev/acpica/include/accommon.h>
46193529Sjkim#include <contrib/dev/acpica/include/acdisasm.h>
47193529Sjkim#include <contrib/dev/acpica/include/actables.h>
48209746Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
49209746Sjkim#include <contrib/dev/acpica/compiler/dtcompiler.h>
50167802Sjkim
51167802Sjkim/* This module used for application-level code only */
52167802Sjkim
53167802Sjkim#define _COMPONENT          ACPI_CA_DISASSEMBLER
54167802Sjkim        ACPI_MODULE_NAME    ("dmtable")
55167802Sjkim
56167802Sjkim/* Local Prototypes */
57167802Sjkim
58167802Sjkimstatic void
59167802SjkimAcpiDmCheckAscii (
60167802Sjkim    UINT8                   *Target,
61197104Sjkim    char                    *RepairedName,
62167802Sjkim    UINT32                  Count);
63167802Sjkim
64167802Sjkim
65220663Sjkim/* Common format strings for commented values */
66220663Sjkim
67220663Sjkim#define UINT8_FORMAT        "%2.2X [%s]\n"
68220663Sjkim#define UINT16_FORMAT       "%4.4X [%s]\n"
69220663Sjkim#define UINT32_FORMAT       "%8.8X [%s]\n"
70220663Sjkim#define STRING_FORMAT       "[%s]\n"
71220663Sjkim
72167802Sjkim/* These tables map a subtable type to a description string */
73167802Sjkim
74193529Sjkimstatic const char           *AcpiDmAsfSubnames[] =
75193529Sjkim{
76193529Sjkim    "ASF Information",
77193529Sjkim    "ASF Alerts",
78193529Sjkim    "ASF Remote Control",
79193529Sjkim    "ASF RMCP Boot Options",
80193529Sjkim    "ASF Address",
81193529Sjkim    "Unknown SubTable Type"         /* Reserved */
82193529Sjkim};
83193529Sjkim
84167802Sjkimstatic const char           *AcpiDmDmarSubnames[] =
85167802Sjkim{
86167802Sjkim    "Hardware Unit Definition",
87167802Sjkim    "Reserved Memory Region",
88193529Sjkim    "Root Port ATS Capability",
89197104Sjkim    "Remapping Hardware Static Affinity",
90167802Sjkim    "Unknown SubTable Type"         /* Reserved */
91167802Sjkim};
92167802Sjkim
93209746Sjkimstatic const char           *AcpiDmEinjActions[] =
94209746Sjkim{
95209746Sjkim    "Begin Operation",
96209746Sjkim    "Get Trigger Table",
97209746Sjkim    "Set Error Type",
98209746Sjkim    "Get Error Type",
99209746Sjkim    "End Operation",
100209746Sjkim    "Execute Operation",
101209746Sjkim    "Check Busy Status",
102209746Sjkim    "Get Command Status",
103209746Sjkim    "Unknown Action"
104209746Sjkim};
105209746Sjkim
106209746Sjkimstatic const char           *AcpiDmEinjInstructions[] =
107209746Sjkim{
108209746Sjkim    "Read Register",
109209746Sjkim    "Read Register Value",
110209746Sjkim    "Write Register",
111209746Sjkim    "Write Register Value",
112209746Sjkim    "Noop",
113209746Sjkim    "Unknown Instruction"
114209746Sjkim};
115209746Sjkim
116209746Sjkimstatic const char           *AcpiDmErstActions[] =
117209746Sjkim{
118209746Sjkim    "Begin Write Operation",
119209746Sjkim    "Begin Read Operation",
120209746Sjkim    "Begin Clear Operation",
121209746Sjkim    "End Operation",
122209746Sjkim    "Set Record Offset",
123209746Sjkim    "Execute Operation",
124209746Sjkim    "Check Busy Status",
125209746Sjkim    "Get Command Status",
126209746Sjkim    "Get Record Identifier",
127209746Sjkim    "Set Record Identifier",
128209746Sjkim    "Get Record Count",
129209746Sjkim    "Begin Dummy Write",
130209746Sjkim    "Unused/Unknown Action",
131209746Sjkim    "Get Error Address Range",
132209746Sjkim    "Get Error Address Length",
133209746Sjkim    "Get Error Attributes",
134209746Sjkim    "Unknown Action"
135209746Sjkim};
136209746Sjkim
137209746Sjkimstatic const char           *AcpiDmErstInstructions[] =
138209746Sjkim{
139209746Sjkim    "Read Register",
140209746Sjkim    "Read Register Value",
141209746Sjkim    "Write Register",
142209746Sjkim    "Write Register Value",
143209746Sjkim    "Noop",
144209746Sjkim    "Load Var1",
145209746Sjkim    "Load Var2",
146209746Sjkim    "Store Var1",
147209746Sjkim    "Add",
148209746Sjkim    "Subtract",
149209746Sjkim    "Add Value",
150209746Sjkim    "Subtract Value",
151209746Sjkim    "Stall",
152209746Sjkim    "Stall While True",
153209746Sjkim    "Skip Next If True",
154209746Sjkim    "GoTo",
155209746Sjkim    "Set Source Address",
156209746Sjkim    "Set Destination Address",
157209746Sjkim    "Move Data",
158209746Sjkim    "Unknown Instruction"
159209746Sjkim};
160209746Sjkim
161193529Sjkimstatic const char           *AcpiDmHestSubnames[] =
162193529Sjkim{
163197104Sjkim    "IA-32 Machine Check Exception",
164197104Sjkim    "IA-32 Corrected Machine Check",
165197104Sjkim    "IA-32 Non-Maskable Interrupt",
166197104Sjkim    "Unknown SubTable Type",        /* 3 - Reserved */
167197104Sjkim    "Unknown SubTable Type",        /* 4 - Reserved */
168197104Sjkim    "Unknown SubTable Type",        /* 5 - Reserved */
169193529Sjkim    "PCI Express Root Port AER",
170193529Sjkim    "PCI Express AER (AER Endpoint)",
171193529Sjkim    "PCI Express/PCI-X Bridge AER",
172193529Sjkim    "Generic Hardware Error Source",
173193529Sjkim    "Unknown SubTable Type"         /* Reserved */
174193529Sjkim};
175193529Sjkim
176193529Sjkimstatic const char           *AcpiDmHestNotifySubnames[] =
177193529Sjkim{
178193529Sjkim    "Polled",
179193529Sjkim    "External Interrupt",
180193529Sjkim    "Local Interrupt",
181193529Sjkim    "SCI",
182193529Sjkim    "NMI",
183193529Sjkim    "Unknown Notify Type"           /* Reserved */
184193529Sjkim};
185193529Sjkim
186167802Sjkimstatic const char           *AcpiDmMadtSubnames[] =
187167802Sjkim{
188167802Sjkim    "Processor Local APIC",         /* ACPI_MADT_TYPE_LOCAL_APIC */
189167802Sjkim    "I/O APIC",                     /* ACPI_MADT_TYPE_IO_APIC */
190167802Sjkim    "Interrupt Source Override",    /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */
191167802Sjkim    "NMI Source",                   /* ACPI_MADT_TYPE_NMI_SOURCE */
192167802Sjkim    "Local APIC NMI",               /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */
193167802Sjkim    "Local APIC Address Override",  /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */
194167802Sjkim    "I/O SAPIC",                    /* ACPI_MADT_TYPE_IO_SAPIC */
195167802Sjkim    "Local SAPIC",                  /* ACPI_MADT_TYPE_LOCAL_SAPIC */
196167802Sjkim    "Platform Interrupt Sources",   /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */
197193529Sjkim    "Processor Local x2APIC",       /* ACPI_MADT_TYPE_LOCAL_X2APIC */
198193529Sjkim    "Local x2APIC NMI",             /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */
199167802Sjkim    "Unknown SubTable Type"         /* Reserved */
200167802Sjkim};
201167802Sjkim
202219707Sjkimstatic const char           *AcpiDmSlicSubnames[] =
203219707Sjkim{
204219707Sjkim    "Public Key Structure",
205219707Sjkim    "Windows Marker Structure",
206219707Sjkim    "Unknown SubTable Type"         /* Reserved */
207219707Sjkim};
208219707Sjkim
209167802Sjkimstatic const char           *AcpiDmSratSubnames[] =
210167802Sjkim{
211167802Sjkim    "Processor Local APIC/SAPIC Affinity",
212167802Sjkim    "Memory Affinity",
213193529Sjkim    "Processor Local x2APIC Affinity",
214167802Sjkim    "Unknown SubTable Type"         /* Reserved */
215167802Sjkim};
216167802Sjkim
217197104Sjkimstatic const char           *AcpiDmIvrsSubnames[] =
218197104Sjkim{
219197104Sjkim    "Hardware Definition Block",
220197104Sjkim    "Memory Definition Block",
221197104Sjkim    "Unknown SubTable Type"         /* Reserved */
222197104Sjkim};
223167802Sjkim
224197104Sjkim
225193529Sjkim#define ACPI_FADT_PM_RESERVED       8
226193529Sjkim
227193529Sjkimstatic const char           *AcpiDmFadtProfiles[] =
228193529Sjkim{
229193529Sjkim    "Unspecified",
230193529Sjkim    "Desktop",
231193529Sjkim    "Mobile",
232193529Sjkim    "Workstation",
233193529Sjkim    "Enterprise Server",
234193529Sjkim    "SOHO Server",
235193529Sjkim    "Appliance PC",
236193529Sjkim    "Performance Server",
237193529Sjkim    "Unknown Profile Type"
238193529Sjkim};
239193529Sjkim
240216471Sjkim#define ACPI_GAS_WIDTH_RESERVED     5
241216471Sjkim
242216471Sjkimstatic const char           *AcpiDmGasAccessWidth[] =
243216471Sjkim{
244216471Sjkim    "Undefined/Legacy",
245216471Sjkim    "Byte Access:8",
246216471Sjkim    "Word Access:16",
247216471Sjkim    "DWord Access:32",
248216471Sjkim    "QWord Access:64",
249216471Sjkim    "Unknown Width Encoding"
250216471Sjkim};
251216471Sjkim
252216471Sjkim
253167802Sjkim/*******************************************************************************
254167802Sjkim *
255167802Sjkim * ACPI Table Data, indexed by signature.
256167802Sjkim *
257209746Sjkim * Each entry contains: Signature, Table Info, Handler, DtHandler,
258209746Sjkim *  Template, Description
259197104Sjkim *
260209746Sjkim * Simple tables have only a TableInfo structure, complex tables have a
261209746Sjkim * handler. This table must be NULL terminated. RSDP and FACS are
262209746Sjkim * special-cased elsewhere.
263167802Sjkim *
264167802Sjkim ******************************************************************************/
265167802Sjkim
266209746SjkimACPI_DMTABLE_DATA    AcpiDmTableData[] =
267167802Sjkim{
268209746Sjkim    {ACPI_SIG_ASF,  NULL,                   AcpiDmDumpAsf,  DtCompileAsf,   TemplateAsf,    "Alert Standard Format table"},
269209746Sjkim    {ACPI_SIG_BOOT, AcpiDmTableInfoBoot,    NULL,           NULL,           TemplateBoot,   "Simple Boot Flag Table"},
270209746Sjkim    {ACPI_SIG_BERT, AcpiDmTableInfoBert,    NULL,           NULL,           TemplateBert,   "Boot Error Record Table"},
271209746Sjkim    {ACPI_SIG_CPEP, NULL,                   AcpiDmDumpCpep, DtCompileCpep,  TemplateCpep,   "Corrected Platform Error Polling table"},
272209746Sjkim    {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp,    NULL,           NULL,           TemplateDbgp,   "Debug Port table"},
273209746Sjkim    {ACPI_SIG_DMAR, NULL,                   AcpiDmDumpDmar, DtCompileDmar,  TemplateDmar,   "DMA Remapping table"},
274209746Sjkim    {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt,    NULL,           NULL,           TemplateEcdt,   "Embedded Controller Boot Resources Table"},
275209746Sjkim    {ACPI_SIG_EINJ, NULL,                   AcpiDmDumpEinj, DtCompileEinj,  TemplateEinj,   "Error Injection table"},
276209746Sjkim    {ACPI_SIG_ERST, NULL,                   AcpiDmDumpErst, DtCompileErst,  TemplateErst,   "Error Record Serialization Table"},
277209746Sjkim    {ACPI_SIG_FADT, NULL,                   AcpiDmDumpFadt, DtCompileFadt,  TemplateFadt,   "Fixed ACPI Description Table"},
278209746Sjkim    {ACPI_SIG_HEST, NULL,                   AcpiDmDumpHest, DtCompileHest,  TemplateHest,   "Hardware Error Source Table"},
279209746Sjkim    {ACPI_SIG_HPET, AcpiDmTableInfoHpet,    NULL,           NULL,           TemplateHpet,   "High Precision Event Timer table"},
280209746Sjkim    {ACPI_SIG_IVRS, NULL,                   AcpiDmDumpIvrs, DtCompileIvrs,  TemplateIvrs,   "I/O Virtualization Reporting Structure"},
281209746Sjkim    {ACPI_SIG_MADT, NULL,                   AcpiDmDumpMadt, DtCompileMadt,  TemplateMadt,   "Multiple APIC Description Table"},
282209746Sjkim    {ACPI_SIG_MCFG, NULL,                   AcpiDmDumpMcfg, DtCompileMcfg,  TemplateMcfg,   "Memory Mapped Configuration table"},
283209746Sjkim    {ACPI_SIG_MCHI, AcpiDmTableInfoMchi,    NULL,           NULL,           TemplateMchi,   "Management Controller Host Interface table"},
284209746Sjkim    {ACPI_SIG_MSCT, NULL,                   AcpiDmDumpMsct, DtCompileMsct,  TemplateMsct,   "Maximum System Characteristics Table"},
285209746Sjkim    {ACPI_SIG_RSDT, NULL,                   AcpiDmDumpRsdt, DtCompileRsdt,  TemplateRsdt,   "Root System Description Table"},
286209746Sjkim    {ACPI_SIG_SBST, AcpiDmTableInfoSbst,    NULL,           NULL,           TemplateSbst,   "Smart Battery Specification Table"},
287219707Sjkim    {ACPI_SIG_SLIC, NULL,                   AcpiDmDumpSlic, DtCompileSlic,  TemplateSlic,   "Software Licensing Description Table"},
288209746Sjkim    {ACPI_SIG_SLIT, NULL,                   AcpiDmDumpSlit, DtCompileSlit,  TemplateSlit,   "System Locality Information Table"},
289209746Sjkim    {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr,    NULL,           NULL,           TemplateSpcr,   "Serial Port Console Redirection table"},
290209746Sjkim    {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi,    NULL,           NULL,           TemplateSpmi,   "Server Platform Management Interface table"},
291209746Sjkim    {ACPI_SIG_SRAT, NULL,                   AcpiDmDumpSrat, DtCompileSrat,  TemplateSrat,   "System Resource Affinity Table"},
292209746Sjkim    {ACPI_SIG_TCPA, AcpiDmTableInfoTcpa,    NULL,           NULL,           TemplateTcpa,   "Trusted Computing Platform Alliance table"},
293217365Sjkim    {ACPI_SIG_UEFI, AcpiDmTableInfoUefi,    NULL,           DtCompileUefi,  TemplateUefi,   "UEFI Boot Optimization Table"},
294209746Sjkim    {ACPI_SIG_WAET, AcpiDmTableInfoWaet,    NULL,           NULL,           TemplateWaet,   "Windows ACPI Emulated Devices Table"},
295209746Sjkim    {ACPI_SIG_WDAT, NULL,                   AcpiDmDumpWdat, DtCompileWdat,  TemplateWdat,   "Watchdog Action Table"},
296209746Sjkim    {ACPI_SIG_WDDT, AcpiDmTableInfoWddt,    NULL,           NULL,           TemplateWddt,   "Watchdog Description Table"},
297209746Sjkim    {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt,    NULL,           NULL,           TemplateWdrt,   "Watchdog Resource Table"},
298209746Sjkim    {ACPI_SIG_XSDT, NULL,                   AcpiDmDumpXsdt, DtCompileXsdt,  TemplateXsdt,   "Extended System Description Table"},
299209746Sjkim    {NULL,          NULL,                   NULL,           NULL,           NULL,           NULL}
300167802Sjkim};
301167802Sjkim
302167802Sjkim
303167802Sjkim/*******************************************************************************
304167802Sjkim *
305209746Sjkim * FUNCTION:    AcpiDmGenerateChecksum
306167802Sjkim *
307209746Sjkim * PARAMETERS:  Table               - Pointer to table to be checksummed
308209746Sjkim *              Length              - Length of the table
309209746Sjkim *              OriginalChecksum    - Value of the checksum field
310167802Sjkim *
311167802Sjkim * RETURN:      8 bit checksum of buffer
312167802Sjkim *
313167802Sjkim * DESCRIPTION: Computes an 8 bit checksum of the table.
314167802Sjkim *
315167802Sjkim ******************************************************************************/
316167802Sjkim
317167802SjkimUINT8
318209746SjkimAcpiDmGenerateChecksum (
319209746Sjkim    void                    *Table,
320209746Sjkim    UINT32                  Length,
321209746Sjkim    UINT8                   OriginalChecksum)
322167802Sjkim{
323167802Sjkim    UINT8                   Checksum;
324167802Sjkim
325167802Sjkim
326167802Sjkim    /* Sum the entire table as-is */
327167802Sjkim
328209746Sjkim    Checksum = AcpiTbChecksum ((UINT8 *) Table, Length);
329167802Sjkim
330167802Sjkim    /* Subtract off the existing checksum value in the table */
331167802Sjkim
332209746Sjkim    Checksum = (UINT8) (Checksum - OriginalChecksum);
333167802Sjkim
334167802Sjkim    /* Compute the final checksum */
335167802Sjkim
336167802Sjkim    Checksum = (UINT8) (0 - Checksum);
337167802Sjkim    return (Checksum);
338167802Sjkim}
339167802Sjkim
340167802Sjkim
341167802Sjkim/*******************************************************************************
342167802Sjkim *
343167802Sjkim * FUNCTION:    AcpiDmGetTableData
344167802Sjkim *
345167802Sjkim * PARAMETERS:  Signature           - ACPI signature (4 chars) to match
346167802Sjkim *
347167802Sjkim * RETURN:      Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found.
348167802Sjkim *
349167802Sjkim * DESCRIPTION: Find a match in the global table of supported ACPI tables
350167802Sjkim *
351167802Sjkim ******************************************************************************/
352167802Sjkim
353209746SjkimACPI_DMTABLE_DATA *
354167802SjkimAcpiDmGetTableData (
355167802Sjkim    char                    *Signature)
356167802Sjkim{
357167802Sjkim    ACPI_DMTABLE_DATA       *TableData;
358167802Sjkim
359167802Sjkim
360167802Sjkim    for (TableData = AcpiDmTableData; TableData->Signature; TableData++)
361167802Sjkim    {
362167802Sjkim        if (ACPI_COMPARE_NAME (Signature, TableData->Signature))
363167802Sjkim        {
364167802Sjkim            return (TableData);
365167802Sjkim        }
366167802Sjkim    }
367167802Sjkim
368167802Sjkim    return (NULL);
369167802Sjkim}
370167802Sjkim
371167802Sjkim
372167802Sjkim/*******************************************************************************
373167802Sjkim *
374167802Sjkim * FUNCTION:    AcpiDmDumpDataTable
375167802Sjkim *
376167802Sjkim * PARAMETERS:  Table               - An ACPI table
377167802Sjkim *
378167802Sjkim * RETURN:      None.
379167802Sjkim *
380167802Sjkim * DESCRIPTION: Format the contents of an ACPI data table (any table other
381167802Sjkim *              than an SSDT or DSDT that does not contain executable AML code)
382167802Sjkim *
383167802Sjkim ******************************************************************************/
384167802Sjkim
385167802Sjkimvoid
386167802SjkimAcpiDmDumpDataTable (
387167802Sjkim    ACPI_TABLE_HEADER       *Table)
388167802Sjkim{
389193529Sjkim    ACPI_STATUS             Status;
390167802Sjkim    ACPI_DMTABLE_DATA       *TableData;
391167802Sjkim    UINT32                  Length;
392167802Sjkim
393167802Sjkim
394167802Sjkim    /* Ignore tables that contain AML */
395167802Sjkim
396167802Sjkim    if (AcpiUtIsAmlTable (Table))
397167802Sjkim    {
398167802Sjkim        return;
399167802Sjkim    }
400167802Sjkim
401167802Sjkim    /*
402167802Sjkim     * Handle tables that don't use the common ACPI table header structure.
403167802Sjkim     * Currently, these are the FACS and RSDP.
404167802Sjkim     */
405167802Sjkim    if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS))
406167802Sjkim    {
407167802Sjkim        Length = Table->Length;
408167802Sjkim        AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs);
409167802Sjkim    }
410167802Sjkim    else if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_RSDP))
411167802Sjkim    {
412167802Sjkim        Length = AcpiDmDumpRsdp (Table);
413167802Sjkim    }
414167802Sjkim    else
415167802Sjkim    {
416167802Sjkim        /*
417167802Sjkim         * All other tables must use the common ACPI table header, dump it now
418167802Sjkim         */
419167802Sjkim        Length = Table->Length;
420193529Sjkim        Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader);
421193529Sjkim        if (ACPI_FAILURE (Status))
422193529Sjkim        {
423193529Sjkim            return;
424193529Sjkim        }
425167802Sjkim        AcpiOsPrintf ("\n");
426167802Sjkim
427167802Sjkim        /* Match signature and dispatch appropriately */
428167802Sjkim
429167802Sjkim        TableData = AcpiDmGetTableData (Table->Signature);
430167802Sjkim        if (!TableData)
431167802Sjkim        {
432167802Sjkim            if (!ACPI_STRNCMP (Table->Signature, "OEM", 3))
433167802Sjkim            {
434167802Sjkim                AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n",
435167802Sjkim                    Table->Signature);
436167802Sjkim            }
437167802Sjkim            else
438167802Sjkim            {
439167802Sjkim                AcpiOsPrintf ("\n**** Unknown ACPI table type [%4.4s]\n\n",
440167802Sjkim                    Table->Signature);
441167802Sjkim            }
442167802Sjkim        }
443167802Sjkim        else if (TableData->TableHandler)
444167802Sjkim        {
445167802Sjkim            /* Complex table, has a handler */
446167802Sjkim
447167802Sjkim            TableData->TableHandler (Table);
448167802Sjkim        }
449167802Sjkim        else if (TableData->TableInfo)
450167802Sjkim        {
451167802Sjkim            /* Simple table, just walk the info table */
452167802Sjkim
453167802Sjkim            AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo);
454167802Sjkim        }
455167802Sjkim    }
456167802Sjkim
457209746Sjkim    if (!Gbl_DoTemplates || Gbl_VerboseTemplates)
458209746Sjkim    {
459209746Sjkim        /* Dump the raw table data */
460167802Sjkim
461217365Sjkim        AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n",
462217365Sjkim            ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
463209746Sjkim        AcpiUtDumpBuffer2 (ACPI_CAST_PTR (UINT8, Table), Length, DB_BYTE_DISPLAY);
464209746Sjkim    }
465167802Sjkim}
466167802Sjkim
467167802Sjkim
468167802Sjkim/*******************************************************************************
469167802Sjkim *
470167802Sjkim * FUNCTION:    AcpiDmLineHeader
471167802Sjkim *
472167802Sjkim * PARAMETERS:  Offset              - Current byte offset, from table start
473167802Sjkim *              ByteLength          - Length of the field in bytes, 0 for flags
474167802Sjkim *              Name                - Name of this field
475167802Sjkim *              Value               - Optional value, displayed on left of ':'
476167802Sjkim *
477167802Sjkim * RETURN:      None
478167802Sjkim *
479167802Sjkim * DESCRIPTION: Utility routines for formatting output lines. Displays the
480167802Sjkim *              current table offset in hex and decimal, the field length,
481167802Sjkim *              and the field name.
482167802Sjkim *
483167802Sjkim ******************************************************************************/
484167802Sjkim
485167802Sjkimvoid
486167802SjkimAcpiDmLineHeader (
487167802Sjkim    UINT32                  Offset,
488167802Sjkim    UINT32                  ByteLength,
489167802Sjkim    char                    *Name)
490167802Sjkim{
491167802Sjkim
492219707Sjkim    /* Allow a null name for fields that span multiple lines (large buffers) */
493219707Sjkim
494219707Sjkim    if (!Name)
495219707Sjkim    {
496219707Sjkim        Name = "";
497219707Sjkim    }
498219707Sjkim
499209746Sjkim    if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */
500167802Sjkim    {
501209746Sjkim        if (ByteLength)
502209746Sjkim        {
503219707Sjkim            AcpiOsPrintf ("[%.4d] %34s : ", ByteLength, Name);
504209746Sjkim        }
505209746Sjkim        else
506209746Sjkim        {
507220663Sjkim            if (*Name)
508220663Sjkim            {
509220663Sjkim                AcpiOsPrintf ("%41s : ", Name);
510220663Sjkim            }
511220663Sjkim            else
512220663Sjkim            {
513220663Sjkim                AcpiOsPrintf ("%41s   ", Name);
514220663Sjkim            }
515209746Sjkim        }
516167802Sjkim    }
517209746Sjkim    else /* Normal disassembler or verbose template */
518167802Sjkim    {
519209746Sjkim        if (ByteLength)
520209746Sjkim        {
521219707Sjkim            AcpiOsPrintf ("[%3.3Xh %4.4d% 4d] %28s : ",
522209746Sjkim                Offset, Offset, ByteLength, Name);
523209746Sjkim        }
524209746Sjkim        else
525209746Sjkim        {
526220663Sjkim            if (*Name)
527220663Sjkim            {
528220663Sjkim                AcpiOsPrintf ("%44s : ", Name);
529220663Sjkim            }
530220663Sjkim            else
531220663Sjkim            {
532220663Sjkim                AcpiOsPrintf ("%44s   ", Name);
533220663Sjkim            }
534209746Sjkim        }
535167802Sjkim    }
536167802Sjkim}
537167802Sjkim
538167802Sjkimvoid
539167802SjkimAcpiDmLineHeader2 (
540167802Sjkim    UINT32                  Offset,
541167802Sjkim    UINT32                  ByteLength,
542167802Sjkim    char                    *Name,
543167802Sjkim    UINT32                  Value)
544167802Sjkim{
545167802Sjkim
546209746Sjkim    if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */
547167802Sjkim    {
548209746Sjkim        if (ByteLength)
549209746Sjkim        {
550220663Sjkim            AcpiOsPrintf ("[%.4d] %30s %3d : ",
551209746Sjkim                ByteLength, Name, Value);
552209746Sjkim        }
553209746Sjkim        else
554209746Sjkim        {
555209746Sjkim            AcpiOsPrintf ("%36s % 3d : ",
556209746Sjkim                Name, Value);
557209746Sjkim        }
558167802Sjkim    }
559209746Sjkim    else /* Normal disassembler or verbose template */
560167802Sjkim    {
561209746Sjkim        if (ByteLength)
562209746Sjkim        {
563220663Sjkim            AcpiOsPrintf ("[%3.3Xh %4.4d %3d] %24s %3d : ",
564209746Sjkim                Offset, Offset, ByteLength, Name, Value);
565209746Sjkim        }
566209746Sjkim        else
567209746Sjkim        {
568220663Sjkim            AcpiOsPrintf ("[%3.3Xh %4.4d   ] %24s %3d : ",
569209746Sjkim                Offset, Offset, Name, Value);
570209746Sjkim        }
571167802Sjkim    }
572167802Sjkim}
573167802Sjkim
574167802Sjkim
575167802Sjkim/*******************************************************************************
576167802Sjkim *
577167802Sjkim * FUNCTION:    AcpiDmDumpTable
578167802Sjkim *
579167802Sjkim * PARAMETERS:  TableLength         - Length of the entire ACPI table
580167802Sjkim *              TableOffset         - Starting offset within the table for this
581167802Sjkim *                                    sub-descriptor (0 if main table)
582167802Sjkim *              Table               - The ACPI table
583193529Sjkim *              SubtableLength      - Length of this sub-descriptor
584167802Sjkim *              Info                - Info table for this ACPI table
585167802Sjkim *
586167802Sjkim * RETURN:      None
587167802Sjkim *
588167802Sjkim * DESCRIPTION: Display ACPI table contents by walking the Info table.
589167802Sjkim *
590209746Sjkim * Note: This function must remain in sync with DtGetFieldLength.
591209746Sjkim *
592167802Sjkim ******************************************************************************/
593167802Sjkim
594193529SjkimACPI_STATUS
595167802SjkimAcpiDmDumpTable (
596167802Sjkim    UINT32                  TableLength,
597167802Sjkim    UINT32                  TableOffset,
598167802Sjkim    void                    *Table,
599167802Sjkim    UINT32                  SubtableLength,
600167802Sjkim    ACPI_DMTABLE_INFO       *Info)
601167802Sjkim{
602167802Sjkim    UINT8                   *Target;
603167802Sjkim    UINT32                  CurrentOffset;
604167802Sjkim    UINT32                  ByteLength;
605167802Sjkim    UINT8                   Temp8;
606167802Sjkim    UINT16                  Temp16;
607167802Sjkim    ACPI_DMTABLE_DATA       *TableData;
608197104Sjkim    const char              *Name;
609193529Sjkim    BOOLEAN                 LastOutputBlankLine = FALSE;
610197104Sjkim    char                    RepairedName[8];
611167802Sjkim
612167802Sjkim
613167802Sjkim    if (!Info)
614167802Sjkim    {
615167802Sjkim        AcpiOsPrintf ("Display not implemented\n");
616193529Sjkim        return (AE_NOT_IMPLEMENTED);
617167802Sjkim    }
618167802Sjkim
619167802Sjkim    /* Walk entire Info table; Null name terminates */
620167802Sjkim
621167802Sjkim    for (; Info->Name; Info++)
622167802Sjkim    {
623167802Sjkim        /*
624167802Sjkim         * Target points to the field within the ACPI Table. CurrentOffset is
625167802Sjkim         * the offset of the field from the start of the main table.
626167802Sjkim         */
627167802Sjkim        Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset);
628167802Sjkim        CurrentOffset = TableOffset + Info->Offset;
629167802Sjkim
630167802Sjkim        /* Check for beyond EOT or beyond subtable end */
631167802Sjkim
632167802Sjkim        if ((CurrentOffset >= TableLength) ||
633167802Sjkim            (SubtableLength && (Info->Offset >= SubtableLength)))
634167802Sjkim        {
635193529Sjkim            AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
636193529Sjkim            return (AE_BAD_DATA);
637167802Sjkim        }
638167802Sjkim
639167802Sjkim        /* Generate the byte length for this field */
640167802Sjkim
641167802Sjkim        switch (Info->Opcode)
642167802Sjkim        {
643167802Sjkim        case ACPI_DMT_UINT8:
644167802Sjkim        case ACPI_DMT_CHKSUM:
645167802Sjkim        case ACPI_DMT_SPACEID:
646216471Sjkim        case ACPI_DMT_ACCWIDTH:
647197104Sjkim        case ACPI_DMT_IVRS:
648167802Sjkim        case ACPI_DMT_MADT:
649167802Sjkim        case ACPI_DMT_SRAT:
650193529Sjkim        case ACPI_DMT_ASF:
651193529Sjkim        case ACPI_DMT_HESTNTYP:
652193529Sjkim        case ACPI_DMT_FADTPM:
653209746Sjkim        case ACPI_DMT_EINJACT:
654209746Sjkim        case ACPI_DMT_EINJINST:
655209746Sjkim        case ACPI_DMT_ERSTACT:
656209746Sjkim        case ACPI_DMT_ERSTINST:
657167802Sjkim            ByteLength = 1;
658167802Sjkim            break;
659167802Sjkim        case ACPI_DMT_UINT16:
660167802Sjkim        case ACPI_DMT_DMAR:
661193529Sjkim        case ACPI_DMT_HEST:
662167802Sjkim            ByteLength = 2;
663167802Sjkim            break;
664167802Sjkim        case ACPI_DMT_UINT24:
665167802Sjkim            ByteLength = 3;
666167802Sjkim            break;
667167802Sjkim        case ACPI_DMT_UINT32:
668167802Sjkim        case ACPI_DMT_NAME4:
669167802Sjkim        case ACPI_DMT_SIG:
670219707Sjkim        case ACPI_DMT_SLIC:
671167802Sjkim            ByteLength = 4;
672167802Sjkim            break;
673167802Sjkim        case ACPI_DMT_NAME6:
674167802Sjkim            ByteLength = 6;
675167802Sjkim            break;
676167802Sjkim        case ACPI_DMT_UINT56:
677218590Sjkim        case ACPI_DMT_BUF7:
678167802Sjkim            ByteLength = 7;
679167802Sjkim            break;
680167802Sjkim        case ACPI_DMT_UINT64:
681167802Sjkim        case ACPI_DMT_NAME8:
682167802Sjkim            ByteLength = 8;
683167802Sjkim            break;
684197104Sjkim        case ACPI_DMT_BUF16:
685217365Sjkim        case ACPI_DMT_UUID:
686197104Sjkim            ByteLength = 16;
687197104Sjkim            break;
688219707Sjkim        case ACPI_DMT_BUF128:
689219707Sjkim            ByteLength = 128;
690219707Sjkim            break;
691167802Sjkim        case ACPI_DMT_STRING:
692167802Sjkim            ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1;
693167802Sjkim            break;
694167802Sjkim        case ACPI_DMT_GAS:
695193529Sjkim            if (!LastOutputBlankLine)
696193529Sjkim            {
697193529Sjkim                AcpiOsPrintf ("\n");
698193529Sjkim                LastOutputBlankLine = TRUE;
699193529Sjkim            }
700167802Sjkim            ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
701167802Sjkim            break;
702193529Sjkim        case ACPI_DMT_HESTNTFY:
703193529Sjkim            if (!LastOutputBlankLine)
704193529Sjkim            {
705193529Sjkim                AcpiOsPrintf ("\n");
706193529Sjkim                LastOutputBlankLine = TRUE;
707193529Sjkim            }
708193529Sjkim            ByteLength = sizeof (ACPI_HEST_NOTIFY);
709193529Sjkim            break;
710167802Sjkim        default:
711167802Sjkim            ByteLength = 0;
712167802Sjkim            break;
713167802Sjkim        }
714167802Sjkim
715193529Sjkim        if (CurrentOffset + ByteLength > TableLength)
716193529Sjkim        {
717193529Sjkim            AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
718193529Sjkim            return (AE_BAD_DATA);
719193529Sjkim        }
720193529Sjkim
721167802Sjkim        /* Start a new line and decode the opcode */
722167802Sjkim
723167802Sjkim        AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name);
724167802Sjkim
725167802Sjkim        switch (Info->Opcode)
726167802Sjkim        {
727167802Sjkim        /* Single-bit Flag fields. Note: Opcode is the bit position */
728167802Sjkim
729167802Sjkim        case ACPI_DMT_FLAG0:
730167802Sjkim        case ACPI_DMT_FLAG1:
731167802Sjkim        case ACPI_DMT_FLAG2:
732167802Sjkim        case ACPI_DMT_FLAG3:
733167802Sjkim        case ACPI_DMT_FLAG4:
734167802Sjkim        case ACPI_DMT_FLAG5:
735167802Sjkim        case ACPI_DMT_FLAG6:
736167802Sjkim        case ACPI_DMT_FLAG7:
737167802Sjkim
738167802Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01);
739167802Sjkim            break;
740167802Sjkim
741167802Sjkim        /* 2-bit Flag fields */
742167802Sjkim
743167802Sjkim        case ACPI_DMT_FLAGS0:
744167802Sjkim
745167802Sjkim            AcpiOsPrintf ("%1.1X\n", *Target & 0x03);
746167802Sjkim            break;
747167802Sjkim
748167802Sjkim        case ACPI_DMT_FLAGS2:
749167802Sjkim
750167802Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03);
751167802Sjkim            break;
752167802Sjkim
753167802Sjkim        /* Standard Data Types */
754167802Sjkim
755167802Sjkim        case ACPI_DMT_UINT8:
756167802Sjkim
757167802Sjkim            AcpiOsPrintf ("%2.2X\n", *Target);
758167802Sjkim            break;
759167802Sjkim
760167802Sjkim        case ACPI_DMT_UINT16:
761167802Sjkim
762167802Sjkim            AcpiOsPrintf ("%4.4X\n", ACPI_GET16 (Target));
763167802Sjkim            break;
764167802Sjkim
765167802Sjkim        case ACPI_DMT_UINT24:
766167802Sjkim
767167802Sjkim            AcpiOsPrintf ("%2.2X%2.2X%2.2X\n",
768167802Sjkim                *Target, *(Target + 1), *(Target + 2));
769167802Sjkim            break;
770167802Sjkim
771167802Sjkim        case ACPI_DMT_UINT32:
772167802Sjkim
773167802Sjkim            AcpiOsPrintf ("%8.8X\n", ACPI_GET32 (Target));
774167802Sjkim            break;
775167802Sjkim
776167802Sjkim        case ACPI_DMT_UINT56:
777167802Sjkim
778193529Sjkim            for (Temp8 = 0; Temp8 < 7; Temp8++)
779193529Sjkim            {
780193529Sjkim                AcpiOsPrintf ("%2.2X", Target[Temp8]);
781193529Sjkim            }
782193529Sjkim            AcpiOsPrintf ("\n");
783167802Sjkim            break;
784167802Sjkim
785167802Sjkim        case ACPI_DMT_UINT64:
786167802Sjkim
787167802Sjkim            AcpiOsPrintf ("%8.8X%8.8X\n",
788167802Sjkim                ACPI_FORMAT_UINT64 (ACPI_GET64 (Target)));
789167802Sjkim            break;
790167802Sjkim
791218590Sjkim        case ACPI_DMT_BUF7:
792197104Sjkim        case ACPI_DMT_BUF16:
793219707Sjkim        case ACPI_DMT_BUF128:
794197104Sjkim
795218590Sjkim            /*
796218590Sjkim             * Buffer: Size depends on the opcode and was set above.
797218590Sjkim             * Each hex byte is separated with a space.
798220663Sjkim             * Multiple lines are separated by line continuation char.
799218590Sjkim             */
800219707Sjkim            for (Temp16 = 0; Temp16 < ByteLength; Temp16++)
801197104Sjkim            {
802219707Sjkim                AcpiOsPrintf ("%2.2X", Target[Temp16]);
803219707Sjkim                if ((UINT32) (Temp16 + 1) < ByteLength)
804209746Sjkim                {
805219707Sjkim                    if ((Temp16 > 0) && (!((Temp16+1) % 16)))
806219707Sjkim                    {
807220663Sjkim                        AcpiOsPrintf (" \\\n"); /* Line continuation */
808219707Sjkim                        AcpiDmLineHeader (0, 0, NULL);
809219707Sjkim                    }
810219707Sjkim                    else
811219707Sjkim                    {
812219707Sjkim                        AcpiOsPrintf (" ");
813219707Sjkim                    }
814209746Sjkim                }
815197104Sjkim            }
816197104Sjkim            AcpiOsPrintf ("\n");
817197104Sjkim            break;
818197104Sjkim
819217365Sjkim        case ACPI_DMT_UUID:
820217365Sjkim
821217365Sjkim            /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */
822217365Sjkim
823217365Sjkim            (void) AuConvertUuidToString ((char *) Target, MsgBuffer);
824217365Sjkim
825217365Sjkim            AcpiOsPrintf ("%s\n", MsgBuffer);
826217365Sjkim            break;
827217365Sjkim
828167802Sjkim        case ACPI_DMT_STRING:
829167802Sjkim
830197104Sjkim            AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target));
831167802Sjkim            break;
832167802Sjkim
833167802Sjkim        /* Fixed length ASCII name fields */
834167802Sjkim
835167802Sjkim        case ACPI_DMT_SIG:
836167802Sjkim
837197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 4);
838197104Sjkim            AcpiOsPrintf ("\"%.4s\"    ", RepairedName);
839167802Sjkim            TableData = AcpiDmGetTableData (ACPI_CAST_PTR (char, Target));
840167802Sjkim            if (TableData)
841167802Sjkim            {
842220663Sjkim                AcpiOsPrintf (STRING_FORMAT, TableData->Name);
843167802Sjkim            }
844220663Sjkim            else
845220663Sjkim            {
846220663Sjkim                AcpiOsPrintf ("\n");
847220663Sjkim            }
848167802Sjkim            break;
849167802Sjkim
850167802Sjkim        case ACPI_DMT_NAME4:
851167802Sjkim
852197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 4);
853197104Sjkim            AcpiOsPrintf ("\"%.4s\"\n", RepairedName);
854167802Sjkim            break;
855167802Sjkim
856167802Sjkim        case ACPI_DMT_NAME6:
857167802Sjkim
858197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 6);
859197104Sjkim            AcpiOsPrintf ("\"%.6s\"\n", RepairedName);
860167802Sjkim            break;
861167802Sjkim
862167802Sjkim        case ACPI_DMT_NAME8:
863167802Sjkim
864197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 8);
865197104Sjkim            AcpiOsPrintf ("\"%.8s\"\n", RepairedName);
866167802Sjkim            break;
867167802Sjkim
868167802Sjkim        /* Special Data Types */
869167802Sjkim
870167802Sjkim        case ACPI_DMT_CHKSUM:
871167802Sjkim
872167802Sjkim            /* Checksum, display and validate */
873167802Sjkim
874167802Sjkim            AcpiOsPrintf ("%2.2X", *Target);
875209746Sjkim            Temp8 = AcpiDmGenerateChecksum (Table,
876209746Sjkim                        ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
877209746Sjkim                        ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum);
878167802Sjkim            if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
879167802Sjkim            {
880167802Sjkim                AcpiOsPrintf (
881167802Sjkim                    "     /* Incorrect checksum, should be %2.2X */", Temp8);
882167802Sjkim            }
883167802Sjkim            AcpiOsPrintf ("\n");
884167802Sjkim            break;
885167802Sjkim
886167802Sjkim        case ACPI_DMT_SPACEID:
887167802Sjkim
888167802Sjkim            /* Address Space ID */
889167802Sjkim
890220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target));
891167802Sjkim            break;
892167802Sjkim
893216471Sjkim        case ACPI_DMT_ACCWIDTH:
894216471Sjkim
895216471Sjkim            /* Encoded Access Width */
896216471Sjkim
897216471Sjkim            Temp8 = *Target;
898216471Sjkim            if (Temp8 > ACPI_GAS_WIDTH_RESERVED)
899216471Sjkim            {
900216471Sjkim                Temp8 = ACPI_GAS_WIDTH_RESERVED;
901216471Sjkim            }
902216471Sjkim
903220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, Temp8, AcpiDmGasAccessWidth[Temp8]);
904216471Sjkim            break;
905216471Sjkim
906167802Sjkim        case ACPI_DMT_GAS:
907167802Sjkim
908167802Sjkim            /* Generic Address Structure */
909167802Sjkim
910220663Sjkim            AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure");
911197104Sjkim            AcpiDmDumpTable (TableLength, CurrentOffset, Target,
912197104Sjkim                sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas);
913193529Sjkim            AcpiOsPrintf ("\n");
914193529Sjkim            LastOutputBlankLine = TRUE;
915167802Sjkim            break;
916167802Sjkim
917193529Sjkim        case ACPI_DMT_ASF:
918193529Sjkim
919193529Sjkim            /* ASF subtable types */
920193529Sjkim
921193529Sjkim            Temp16 = (UINT16) ((*Target) & 0x7F);  /* Top bit can be zero or one */
922193529Sjkim            if (Temp16 > ACPI_ASF_TYPE_RESERVED)
923193529Sjkim            {
924193529Sjkim                Temp16 = ACPI_ASF_TYPE_RESERVED;
925193529Sjkim            }
926193529Sjkim
927220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]);
928193529Sjkim            break;
929193529Sjkim
930167802Sjkim        case ACPI_DMT_DMAR:
931167802Sjkim
932167802Sjkim            /* DMAR subtable types */
933167802Sjkim
934193529Sjkim            Temp16 = ACPI_GET16 (Target);
935167802Sjkim            if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
936167802Sjkim            {
937167802Sjkim                Temp16 = ACPI_DMAR_TYPE_RESERVED;
938167802Sjkim            }
939167802Sjkim
940220663Sjkim            AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmDmarSubnames[Temp16]);
941167802Sjkim            break;
942167802Sjkim
943209746Sjkim        case ACPI_DMT_EINJACT:
944209746Sjkim
945209746Sjkim            /* EINJ Action types */
946209746Sjkim
947209746Sjkim            Temp8 = *Target;
948209746Sjkim            if (Temp8 > ACPI_EINJ_ACTION_RESERVED)
949209746Sjkim            {
950209746Sjkim                Temp8 = ACPI_EINJ_ACTION_RESERVED;
951209746Sjkim            }
952209746Sjkim
953220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmEinjActions[Temp8]);
954209746Sjkim            break;
955209746Sjkim
956209746Sjkim        case ACPI_DMT_EINJINST:
957209746Sjkim
958209746Sjkim            /* EINJ Instruction types */
959209746Sjkim
960209746Sjkim            Temp8 = *Target;
961209746Sjkim            if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED)
962209746Sjkim            {
963209746Sjkim                Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED;
964209746Sjkim            }
965209746Sjkim
966220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmEinjInstructions[Temp8]);
967209746Sjkim            break;
968209746Sjkim
969209746Sjkim        case ACPI_DMT_ERSTACT:
970209746Sjkim
971209746Sjkim            /* ERST Action types */
972209746Sjkim
973209746Sjkim            Temp8 = *Target;
974209746Sjkim            if (Temp8 > ACPI_ERST_ACTION_RESERVED)
975209746Sjkim            {
976209746Sjkim                Temp8 = ACPI_ERST_ACTION_RESERVED;
977209746Sjkim            }
978209746Sjkim
979220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmErstActions[Temp8]);
980209746Sjkim            break;
981209746Sjkim
982209746Sjkim        case ACPI_DMT_ERSTINST:
983209746Sjkim
984209746Sjkim            /* ERST Instruction types */
985209746Sjkim
986209746Sjkim            Temp8 = *Target;
987209746Sjkim            if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED)
988209746Sjkim            {
989209746Sjkim                Temp8 = ACPI_ERST_INSTRUCTION_RESERVED;
990209746Sjkim            }
991209746Sjkim
992220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmErstInstructions[Temp8]);
993209746Sjkim            break;
994209746Sjkim
995193529Sjkim        case ACPI_DMT_HEST:
996193529Sjkim
997193529Sjkim            /* HEST subtable types */
998193529Sjkim
999193529Sjkim            Temp16 = ACPI_GET16 (Target);
1000193529Sjkim            if (Temp16 > ACPI_HEST_TYPE_RESERVED)
1001193529Sjkim            {
1002193529Sjkim                Temp16 = ACPI_HEST_TYPE_RESERVED;
1003193529Sjkim            }
1004193529Sjkim
1005220663Sjkim            AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmHestSubnames[Temp16]);
1006193529Sjkim            break;
1007193529Sjkim
1008193529Sjkim        case ACPI_DMT_HESTNTFY:
1009193529Sjkim
1010220663Sjkim            AcpiOsPrintf (STRING_FORMAT, "Hardware Error Notification Structure");
1011197104Sjkim            AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1012197104Sjkim                sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify);
1013193529Sjkim            AcpiOsPrintf ("\n");
1014193529Sjkim            LastOutputBlankLine = TRUE;
1015193529Sjkim            break;
1016193529Sjkim
1017193529Sjkim        case ACPI_DMT_HESTNTYP:
1018193529Sjkim
1019193529Sjkim            /* HEST Notify types */
1020193529Sjkim
1021193529Sjkim            Temp8 = *Target;
1022193529Sjkim            if (Temp8 > ACPI_HEST_NOTIFY_RESERVED)
1023193529Sjkim            {
1024193529Sjkim                Temp8 = ACPI_HEST_NOTIFY_RESERVED;
1025193529Sjkim            }
1026193529Sjkim
1027220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmHestNotifySubnames[Temp8]);
1028193529Sjkim            break;
1029193529Sjkim
1030167802Sjkim        case ACPI_DMT_MADT:
1031167802Sjkim
1032167802Sjkim            /* MADT subtable types */
1033167802Sjkim
1034167802Sjkim            Temp8 = *Target;
1035167802Sjkim            if (Temp8 > ACPI_MADT_TYPE_RESERVED)
1036167802Sjkim            {
1037167802Sjkim                Temp8 = ACPI_MADT_TYPE_RESERVED;
1038167802Sjkim            }
1039167802Sjkim
1040220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmMadtSubnames[Temp8]);
1041167802Sjkim            break;
1042167802Sjkim
1043219707Sjkim        case ACPI_DMT_SLIC:
1044219707Sjkim
1045219707Sjkim            /* SLIC subtable types */
1046219707Sjkim
1047219707Sjkim            Temp8 = *Target;
1048219707Sjkim            if (Temp8 > ACPI_SLIC_TYPE_RESERVED)
1049219707Sjkim            {
1050219707Sjkim                Temp8 = ACPI_SLIC_TYPE_RESERVED;
1051219707Sjkim            }
1052219707Sjkim
1053220663Sjkim            AcpiOsPrintf (UINT32_FORMAT, *Target, AcpiDmSlicSubnames[Temp8]);
1054219707Sjkim            break;
1055219707Sjkim
1056167802Sjkim        case ACPI_DMT_SRAT:
1057167802Sjkim
1058167802Sjkim            /* SRAT subtable types */
1059167802Sjkim
1060167802Sjkim            Temp8 = *Target;
1061167802Sjkim            if (Temp8 > ACPI_SRAT_TYPE_RESERVED)
1062167802Sjkim            {
1063167802Sjkim                Temp8 = ACPI_SRAT_TYPE_RESERVED;
1064167802Sjkim            }
1065167802Sjkim
1066220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmSratSubnames[Temp8]);
1067167802Sjkim            break;
1068167802Sjkim
1069193529Sjkim        case ACPI_DMT_FADTPM:
1070193529Sjkim
1071193529Sjkim            /* FADT Preferred PM Profile names */
1072193529Sjkim
1073193529Sjkim            Temp8 = *Target;
1074193529Sjkim            if (Temp8 > ACPI_FADT_PM_RESERVED)
1075193529Sjkim            {
1076193529Sjkim                Temp8 = ACPI_FADT_PM_RESERVED;
1077193529Sjkim            }
1078193529Sjkim
1079220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmFadtProfiles[Temp8]);
1080193529Sjkim            break;
1081193529Sjkim
1082197104Sjkim        case ACPI_DMT_IVRS:
1083197104Sjkim
1084197104Sjkim            /* IVRS subtable types */
1085197104Sjkim
1086197104Sjkim            Temp8 = *Target;
1087197104Sjkim            switch (Temp8)
1088197104Sjkim            {
1089197104Sjkim            case ACPI_IVRS_TYPE_HARDWARE:
1090197104Sjkim                Name = AcpiDmIvrsSubnames[0];
1091197104Sjkim                break;
1092197104Sjkim
1093197104Sjkim            case ACPI_IVRS_TYPE_MEMORY1:
1094197104Sjkim            case ACPI_IVRS_TYPE_MEMORY2:
1095197104Sjkim            case ACPI_IVRS_TYPE_MEMORY3:
1096197104Sjkim                Name = AcpiDmIvrsSubnames[1];
1097197104Sjkim                break;
1098197104Sjkim
1099197104Sjkim            default:
1100197104Sjkim                Name = AcpiDmIvrsSubnames[2];
1101197104Sjkim                break;
1102197104Sjkim            }
1103197104Sjkim
1104220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, Name);
1105197104Sjkim            break;
1106197104Sjkim
1107167802Sjkim        case ACPI_DMT_EXIT:
1108193529Sjkim            return (AE_OK);
1109167802Sjkim
1110167802Sjkim        default:
1111167802Sjkim            ACPI_ERROR ((AE_INFO,
1112204773Sjkim                "**** Invalid table opcode [0x%X] ****\n", Info->Opcode));
1113193529Sjkim            return (AE_SUPPORT);
1114167802Sjkim        }
1115167802Sjkim    }
1116193529Sjkim
1117193529Sjkim    if (TableOffset && !SubtableLength)
1118193529Sjkim    {
1119193529Sjkim        /* If this table is not the main table, subtable must have valid length */
1120193529Sjkim
1121193529Sjkim        AcpiOsPrintf ("Invalid zero length subtable\n");
1122193529Sjkim        return (AE_BAD_DATA);
1123193529Sjkim    }
1124193529Sjkim
1125193529Sjkim    return (AE_OK);
1126167802Sjkim}
1127167802Sjkim
1128167802Sjkim
1129167802Sjkim/*******************************************************************************
1130167802Sjkim *
1131167802Sjkim * FUNCTION:    AcpiDmCheckAscii
1132167802Sjkim *
1133167802Sjkim * PARAMETERS:  Name                - Ascii string
1134167802Sjkim *              Count               - Number of characters to check
1135167802Sjkim *
1136167802Sjkim * RETURN:      None
1137167802Sjkim *
1138167802Sjkim * DESCRIPTION: Ensure that the requested number of characters are printable
1139167802Sjkim *              Ascii characters. Sets non-printable and null chars to <space>.
1140167802Sjkim *
1141167802Sjkim ******************************************************************************/
1142167802Sjkim
1143167802Sjkimstatic void
1144167802SjkimAcpiDmCheckAscii (
1145167802Sjkim    UINT8                   *Name,
1146197104Sjkim    char                    *RepairedName,
1147167802Sjkim    UINT32                  Count)
1148167802Sjkim{
1149167802Sjkim    UINT32                  i;
1150167802Sjkim
1151167802Sjkim
1152167802Sjkim    for (i = 0; i < Count; i++)
1153167802Sjkim    {
1154198237Sjkim        RepairedName[i] = (char) Name[i];
1155197104Sjkim
1156197104Sjkim        if (!Name[i])
1157167802Sjkim        {
1158197104Sjkim            return;
1159167802Sjkim        }
1160197104Sjkim        if (!isprint (Name[i]))
1161197104Sjkim        {
1162197104Sjkim            RepairedName[i] = ' ';
1163197104Sjkim        }
1164167802Sjkim    }
1165167802Sjkim}
1166