dmtable.c revision 218590
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
65167802Sjkim/* These tables map a subtable type to a description string */
66167802Sjkim
67193529Sjkimstatic const char           *AcpiDmAsfSubnames[] =
68193529Sjkim{
69193529Sjkim    "ASF Information",
70193529Sjkim    "ASF Alerts",
71193529Sjkim    "ASF Remote Control",
72193529Sjkim    "ASF RMCP Boot Options",
73193529Sjkim    "ASF Address",
74193529Sjkim    "Unknown SubTable Type"         /* Reserved */
75193529Sjkim};
76193529Sjkim
77167802Sjkimstatic const char           *AcpiDmDmarSubnames[] =
78167802Sjkim{
79167802Sjkim    "Hardware Unit Definition",
80167802Sjkim    "Reserved Memory Region",
81193529Sjkim    "Root Port ATS Capability",
82197104Sjkim    "Remapping Hardware Static Affinity",
83167802Sjkim    "Unknown SubTable Type"         /* Reserved */
84167802Sjkim};
85167802Sjkim
86209746Sjkimstatic const char           *AcpiDmEinjActions[] =
87209746Sjkim{
88209746Sjkim    "Begin Operation",
89209746Sjkim    "Get Trigger Table",
90209746Sjkim    "Set Error Type",
91209746Sjkim    "Get Error Type",
92209746Sjkim    "End Operation",
93209746Sjkim    "Execute Operation",
94209746Sjkim    "Check Busy Status",
95209746Sjkim    "Get Command Status",
96209746Sjkim    "Unknown Action"
97209746Sjkim};
98209746Sjkim
99209746Sjkimstatic const char           *AcpiDmEinjInstructions[] =
100209746Sjkim{
101209746Sjkim    "Read Register",
102209746Sjkim    "Read Register Value",
103209746Sjkim    "Write Register",
104209746Sjkim    "Write Register Value",
105209746Sjkim    "Noop",
106209746Sjkim    "Unknown Instruction"
107209746Sjkim};
108209746Sjkim
109209746Sjkimstatic const char           *AcpiDmErstActions[] =
110209746Sjkim{
111209746Sjkim    "Begin Write Operation",
112209746Sjkim    "Begin Read Operation",
113209746Sjkim    "Begin Clear Operation",
114209746Sjkim    "End Operation",
115209746Sjkim    "Set Record Offset",
116209746Sjkim    "Execute Operation",
117209746Sjkim    "Check Busy Status",
118209746Sjkim    "Get Command Status",
119209746Sjkim    "Get Record Identifier",
120209746Sjkim    "Set Record Identifier",
121209746Sjkim    "Get Record Count",
122209746Sjkim    "Begin Dummy Write",
123209746Sjkim    "Unused/Unknown Action",
124209746Sjkim    "Get Error Address Range",
125209746Sjkim    "Get Error Address Length",
126209746Sjkim    "Get Error Attributes",
127209746Sjkim    "Unknown Action"
128209746Sjkim};
129209746Sjkim
130209746Sjkimstatic const char           *AcpiDmErstInstructions[] =
131209746Sjkim{
132209746Sjkim    "Read Register",
133209746Sjkim    "Read Register Value",
134209746Sjkim    "Write Register",
135209746Sjkim    "Write Register Value",
136209746Sjkim    "Noop",
137209746Sjkim    "Load Var1",
138209746Sjkim    "Load Var2",
139209746Sjkim    "Store Var1",
140209746Sjkim    "Add",
141209746Sjkim    "Subtract",
142209746Sjkim    "Add Value",
143209746Sjkim    "Subtract Value",
144209746Sjkim    "Stall",
145209746Sjkim    "Stall While True",
146209746Sjkim    "Skip Next If True",
147209746Sjkim    "GoTo",
148209746Sjkim    "Set Source Address",
149209746Sjkim    "Set Destination Address",
150209746Sjkim    "Move Data",
151209746Sjkim    "Unknown Instruction"
152209746Sjkim};
153209746Sjkim
154193529Sjkimstatic const char           *AcpiDmHestSubnames[] =
155193529Sjkim{
156197104Sjkim    "IA-32 Machine Check Exception",
157197104Sjkim    "IA-32 Corrected Machine Check",
158197104Sjkim    "IA-32 Non-Maskable Interrupt",
159197104Sjkim    "Unknown SubTable Type",        /* 3 - Reserved */
160197104Sjkim    "Unknown SubTable Type",        /* 4 - Reserved */
161197104Sjkim    "Unknown SubTable Type",        /* 5 - Reserved */
162193529Sjkim    "PCI Express Root Port AER",
163193529Sjkim    "PCI Express AER (AER Endpoint)",
164193529Sjkim    "PCI Express/PCI-X Bridge AER",
165193529Sjkim    "Generic Hardware Error Source",
166193529Sjkim    "Unknown SubTable Type"         /* Reserved */
167193529Sjkim};
168193529Sjkim
169193529Sjkimstatic const char           *AcpiDmHestNotifySubnames[] =
170193529Sjkim{
171193529Sjkim    "Polled",
172193529Sjkim    "External Interrupt",
173193529Sjkim    "Local Interrupt",
174193529Sjkim    "SCI",
175193529Sjkim    "NMI",
176193529Sjkim    "Unknown Notify Type"           /* Reserved */
177193529Sjkim};
178193529Sjkim
179167802Sjkimstatic const char           *AcpiDmMadtSubnames[] =
180167802Sjkim{
181167802Sjkim    "Processor Local APIC",         /* ACPI_MADT_TYPE_LOCAL_APIC */
182167802Sjkim    "I/O APIC",                     /* ACPI_MADT_TYPE_IO_APIC */
183167802Sjkim    "Interrupt Source Override",    /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */
184167802Sjkim    "NMI Source",                   /* ACPI_MADT_TYPE_NMI_SOURCE */
185167802Sjkim    "Local APIC NMI",               /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */
186167802Sjkim    "Local APIC Address Override",  /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */
187167802Sjkim    "I/O SAPIC",                    /* ACPI_MADT_TYPE_IO_SAPIC */
188167802Sjkim    "Local SAPIC",                  /* ACPI_MADT_TYPE_LOCAL_SAPIC */
189167802Sjkim    "Platform Interrupt Sources",   /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */
190193529Sjkim    "Processor Local x2APIC",       /* ACPI_MADT_TYPE_LOCAL_X2APIC */
191193529Sjkim    "Local x2APIC NMI",             /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */
192167802Sjkim    "Unknown SubTable Type"         /* Reserved */
193167802Sjkim};
194167802Sjkim
195167802Sjkimstatic const char           *AcpiDmSratSubnames[] =
196167802Sjkim{
197167802Sjkim    "Processor Local APIC/SAPIC Affinity",
198167802Sjkim    "Memory Affinity",
199193529Sjkim    "Processor Local x2APIC Affinity",
200167802Sjkim    "Unknown SubTable Type"         /* Reserved */
201167802Sjkim};
202167802Sjkim
203197104Sjkimstatic const char           *AcpiDmIvrsSubnames[] =
204197104Sjkim{
205197104Sjkim    "Hardware Definition Block",
206197104Sjkim    "Memory Definition Block",
207197104Sjkim    "Unknown SubTable Type"         /* Reserved */
208197104Sjkim};
209167802Sjkim
210197104Sjkim
211193529Sjkim#define ACPI_FADT_PM_RESERVED       8
212193529Sjkim
213193529Sjkimstatic const char           *AcpiDmFadtProfiles[] =
214193529Sjkim{
215193529Sjkim    "Unspecified",
216193529Sjkim    "Desktop",
217193529Sjkim    "Mobile",
218193529Sjkim    "Workstation",
219193529Sjkim    "Enterprise Server",
220193529Sjkim    "SOHO Server",
221193529Sjkim    "Appliance PC",
222193529Sjkim    "Performance Server",
223193529Sjkim    "Unknown Profile Type"
224193529Sjkim};
225193529Sjkim
226216471Sjkim#define ACPI_GAS_WIDTH_RESERVED     5
227216471Sjkim
228216471Sjkimstatic const char           *AcpiDmGasAccessWidth[] =
229216471Sjkim{
230216471Sjkim    "Undefined/Legacy",
231216471Sjkim    "Byte Access:8",
232216471Sjkim    "Word Access:16",
233216471Sjkim    "DWord Access:32",
234216471Sjkim    "QWord Access:64",
235216471Sjkim    "Unknown Width Encoding"
236216471Sjkim};
237216471Sjkim
238216471Sjkim
239167802Sjkim/*******************************************************************************
240167802Sjkim *
241167802Sjkim * ACPI Table Data, indexed by signature.
242167802Sjkim *
243209746Sjkim * Each entry contains: Signature, Table Info, Handler, DtHandler,
244209746Sjkim *  Template, Description
245197104Sjkim *
246209746Sjkim * Simple tables have only a TableInfo structure, complex tables have a
247209746Sjkim * handler. This table must be NULL terminated. RSDP and FACS are
248209746Sjkim * special-cased elsewhere.
249167802Sjkim *
250167802Sjkim ******************************************************************************/
251167802Sjkim
252209746SjkimACPI_DMTABLE_DATA    AcpiDmTableData[] =
253167802Sjkim{
254209746Sjkim    {ACPI_SIG_ASF,  NULL,                   AcpiDmDumpAsf,  DtCompileAsf,   TemplateAsf,    "Alert Standard Format table"},
255209746Sjkim    {ACPI_SIG_BOOT, AcpiDmTableInfoBoot,    NULL,           NULL,           TemplateBoot,   "Simple Boot Flag Table"},
256209746Sjkim    {ACPI_SIG_BERT, AcpiDmTableInfoBert,    NULL,           NULL,           TemplateBert,   "Boot Error Record Table"},
257209746Sjkim    {ACPI_SIG_CPEP, NULL,                   AcpiDmDumpCpep, DtCompileCpep,  TemplateCpep,   "Corrected Platform Error Polling table"},
258209746Sjkim    {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp,    NULL,           NULL,           TemplateDbgp,   "Debug Port table"},
259209746Sjkim    {ACPI_SIG_DMAR, NULL,                   AcpiDmDumpDmar, DtCompileDmar,  TemplateDmar,   "DMA Remapping table"},
260209746Sjkim    {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt,    NULL,           NULL,           TemplateEcdt,   "Embedded Controller Boot Resources Table"},
261209746Sjkim    {ACPI_SIG_EINJ, NULL,                   AcpiDmDumpEinj, DtCompileEinj,  TemplateEinj,   "Error Injection table"},
262209746Sjkim    {ACPI_SIG_ERST, NULL,                   AcpiDmDumpErst, DtCompileErst,  TemplateErst,   "Error Record Serialization Table"},
263209746Sjkim    {ACPI_SIG_FADT, NULL,                   AcpiDmDumpFadt, DtCompileFadt,  TemplateFadt,   "Fixed ACPI Description Table"},
264209746Sjkim    {ACPI_SIG_HEST, NULL,                   AcpiDmDumpHest, DtCompileHest,  TemplateHest,   "Hardware Error Source Table"},
265209746Sjkim    {ACPI_SIG_HPET, AcpiDmTableInfoHpet,    NULL,           NULL,           TemplateHpet,   "High Precision Event Timer table"},
266209746Sjkim    {ACPI_SIG_IVRS, NULL,                   AcpiDmDumpIvrs, DtCompileIvrs,  TemplateIvrs,   "I/O Virtualization Reporting Structure"},
267209746Sjkim    {ACPI_SIG_MADT, NULL,                   AcpiDmDumpMadt, DtCompileMadt,  TemplateMadt,   "Multiple APIC Description Table"},
268209746Sjkim    {ACPI_SIG_MCFG, NULL,                   AcpiDmDumpMcfg, DtCompileMcfg,  TemplateMcfg,   "Memory Mapped Configuration table"},
269209746Sjkim    {ACPI_SIG_MCHI, AcpiDmTableInfoMchi,    NULL,           NULL,           TemplateMchi,   "Management Controller Host Interface table"},
270209746Sjkim    {ACPI_SIG_MSCT, NULL,                   AcpiDmDumpMsct, DtCompileMsct,  TemplateMsct,   "Maximum System Characteristics Table"},
271209746Sjkim    {ACPI_SIG_RSDT, NULL,                   AcpiDmDumpRsdt, DtCompileRsdt,  TemplateRsdt,   "Root System Description Table"},
272209746Sjkim    {ACPI_SIG_SBST, AcpiDmTableInfoSbst,    NULL,           NULL,           TemplateSbst,   "Smart Battery Specification Table"},
273209746Sjkim    {ACPI_SIG_SLIC, AcpiDmTableInfoSlic,    NULL,           NULL,           NULL,           "Software Licensing Description Table"},
274209746Sjkim    {ACPI_SIG_SLIT, NULL,                   AcpiDmDumpSlit, DtCompileSlit,  TemplateSlit,   "System Locality Information Table"},
275209746Sjkim    {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr,    NULL,           NULL,           TemplateSpcr,   "Serial Port Console Redirection table"},
276209746Sjkim    {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi,    NULL,           NULL,           TemplateSpmi,   "Server Platform Management Interface table"},
277209746Sjkim    {ACPI_SIG_SRAT, NULL,                   AcpiDmDumpSrat, DtCompileSrat,  TemplateSrat,   "System Resource Affinity Table"},
278209746Sjkim    {ACPI_SIG_TCPA, AcpiDmTableInfoTcpa,    NULL,           NULL,           TemplateTcpa,   "Trusted Computing Platform Alliance table"},
279217365Sjkim    {ACPI_SIG_UEFI, AcpiDmTableInfoUefi,    NULL,           DtCompileUefi,  TemplateUefi,   "UEFI Boot Optimization Table"},
280209746Sjkim    {ACPI_SIG_WAET, AcpiDmTableInfoWaet,    NULL,           NULL,           TemplateWaet,   "Windows ACPI Emulated Devices Table"},
281209746Sjkim    {ACPI_SIG_WDAT, NULL,                   AcpiDmDumpWdat, DtCompileWdat,  TemplateWdat,   "Watchdog Action Table"},
282209746Sjkim    {ACPI_SIG_WDDT, AcpiDmTableInfoWddt,    NULL,           NULL,           TemplateWddt,   "Watchdog Description Table"},
283209746Sjkim    {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt,    NULL,           NULL,           TemplateWdrt,   "Watchdog Resource Table"},
284209746Sjkim    {ACPI_SIG_XSDT, NULL,                   AcpiDmDumpXsdt, DtCompileXsdt,  TemplateXsdt,   "Extended System Description Table"},
285209746Sjkim    {NULL,          NULL,                   NULL,           NULL,           NULL,           NULL}
286167802Sjkim};
287167802Sjkim
288167802Sjkim
289167802Sjkim/*******************************************************************************
290167802Sjkim *
291209746Sjkim * FUNCTION:    AcpiDmGenerateChecksum
292167802Sjkim *
293209746Sjkim * PARAMETERS:  Table               - Pointer to table to be checksummed
294209746Sjkim *              Length              - Length of the table
295209746Sjkim *              OriginalChecksum    - Value of the checksum field
296167802Sjkim *
297167802Sjkim * RETURN:      8 bit checksum of buffer
298167802Sjkim *
299167802Sjkim * DESCRIPTION: Computes an 8 bit checksum of the table.
300167802Sjkim *
301167802Sjkim ******************************************************************************/
302167802Sjkim
303167802SjkimUINT8
304209746SjkimAcpiDmGenerateChecksum (
305209746Sjkim    void                    *Table,
306209746Sjkim    UINT32                  Length,
307209746Sjkim    UINT8                   OriginalChecksum)
308167802Sjkim{
309167802Sjkim    UINT8                   Checksum;
310167802Sjkim
311167802Sjkim
312167802Sjkim    /* Sum the entire table as-is */
313167802Sjkim
314209746Sjkim    Checksum = AcpiTbChecksum ((UINT8 *) Table, Length);
315167802Sjkim
316167802Sjkim    /* Subtract off the existing checksum value in the table */
317167802Sjkim
318209746Sjkim    Checksum = (UINT8) (Checksum - OriginalChecksum);
319167802Sjkim
320167802Sjkim    /* Compute the final checksum */
321167802Sjkim
322167802Sjkim    Checksum = (UINT8) (0 - Checksum);
323167802Sjkim    return (Checksum);
324167802Sjkim}
325167802Sjkim
326167802Sjkim
327167802Sjkim/*******************************************************************************
328167802Sjkim *
329167802Sjkim * FUNCTION:    AcpiDmGetTableData
330167802Sjkim *
331167802Sjkim * PARAMETERS:  Signature           - ACPI signature (4 chars) to match
332167802Sjkim *
333167802Sjkim * RETURN:      Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found.
334167802Sjkim *
335167802Sjkim * DESCRIPTION: Find a match in the global table of supported ACPI tables
336167802Sjkim *
337167802Sjkim ******************************************************************************/
338167802Sjkim
339209746SjkimACPI_DMTABLE_DATA *
340167802SjkimAcpiDmGetTableData (
341167802Sjkim    char                    *Signature)
342167802Sjkim{
343167802Sjkim    ACPI_DMTABLE_DATA       *TableData;
344167802Sjkim
345167802Sjkim
346167802Sjkim    for (TableData = AcpiDmTableData; TableData->Signature; TableData++)
347167802Sjkim    {
348167802Sjkim        if (ACPI_COMPARE_NAME (Signature, TableData->Signature))
349167802Sjkim        {
350167802Sjkim            return (TableData);
351167802Sjkim        }
352167802Sjkim    }
353167802Sjkim
354167802Sjkim    return (NULL);
355167802Sjkim}
356167802Sjkim
357167802Sjkim
358167802Sjkim/*******************************************************************************
359167802Sjkim *
360167802Sjkim * FUNCTION:    AcpiDmDumpDataTable
361167802Sjkim *
362167802Sjkim * PARAMETERS:  Table               - An ACPI table
363167802Sjkim *
364167802Sjkim * RETURN:      None.
365167802Sjkim *
366167802Sjkim * DESCRIPTION: Format the contents of an ACPI data table (any table other
367167802Sjkim *              than an SSDT or DSDT that does not contain executable AML code)
368167802Sjkim *
369167802Sjkim ******************************************************************************/
370167802Sjkim
371167802Sjkimvoid
372167802SjkimAcpiDmDumpDataTable (
373167802Sjkim    ACPI_TABLE_HEADER       *Table)
374167802Sjkim{
375193529Sjkim    ACPI_STATUS             Status;
376167802Sjkim    ACPI_DMTABLE_DATA       *TableData;
377167802Sjkim    UINT32                  Length;
378167802Sjkim
379167802Sjkim
380167802Sjkim    /* Ignore tables that contain AML */
381167802Sjkim
382167802Sjkim    if (AcpiUtIsAmlTable (Table))
383167802Sjkim    {
384167802Sjkim        return;
385167802Sjkim    }
386167802Sjkim
387167802Sjkim    /*
388167802Sjkim     * Handle tables that don't use the common ACPI table header structure.
389167802Sjkim     * Currently, these are the FACS and RSDP.
390167802Sjkim     */
391167802Sjkim    if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS))
392167802Sjkim    {
393167802Sjkim        Length = Table->Length;
394167802Sjkim        AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs);
395167802Sjkim    }
396167802Sjkim    else if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_RSDP))
397167802Sjkim    {
398167802Sjkim        Length = AcpiDmDumpRsdp (Table);
399167802Sjkim    }
400167802Sjkim    else
401167802Sjkim    {
402167802Sjkim        /*
403167802Sjkim         * All other tables must use the common ACPI table header, dump it now
404167802Sjkim         */
405167802Sjkim        Length = Table->Length;
406193529Sjkim        Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader);
407193529Sjkim        if (ACPI_FAILURE (Status))
408193529Sjkim        {
409193529Sjkim            return;
410193529Sjkim        }
411167802Sjkim        AcpiOsPrintf ("\n");
412167802Sjkim
413167802Sjkim        /* Match signature and dispatch appropriately */
414167802Sjkim
415167802Sjkim        TableData = AcpiDmGetTableData (Table->Signature);
416167802Sjkim        if (!TableData)
417167802Sjkim        {
418167802Sjkim            if (!ACPI_STRNCMP (Table->Signature, "OEM", 3))
419167802Sjkim            {
420167802Sjkim                AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n",
421167802Sjkim                    Table->Signature);
422167802Sjkim            }
423167802Sjkim            else
424167802Sjkim            {
425167802Sjkim                AcpiOsPrintf ("\n**** Unknown ACPI table type [%4.4s]\n\n",
426167802Sjkim                    Table->Signature);
427167802Sjkim            }
428167802Sjkim        }
429167802Sjkim        else if (TableData->TableHandler)
430167802Sjkim        {
431167802Sjkim            /* Complex table, has a handler */
432167802Sjkim
433167802Sjkim            TableData->TableHandler (Table);
434167802Sjkim        }
435167802Sjkim        else if (TableData->TableInfo)
436167802Sjkim        {
437167802Sjkim            /* Simple table, just walk the info table */
438167802Sjkim
439167802Sjkim            AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo);
440167802Sjkim        }
441167802Sjkim    }
442167802Sjkim
443209746Sjkim    if (!Gbl_DoTemplates || Gbl_VerboseTemplates)
444209746Sjkim    {
445209746Sjkim        /* Dump the raw table data */
446167802Sjkim
447217365Sjkim        AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n",
448217365Sjkim            ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
449209746Sjkim        AcpiUtDumpBuffer2 (ACPI_CAST_PTR (UINT8, Table), Length, DB_BYTE_DISPLAY);
450209746Sjkim    }
451167802Sjkim}
452167802Sjkim
453167802Sjkim
454167802Sjkim/*******************************************************************************
455167802Sjkim *
456167802Sjkim * FUNCTION:    AcpiDmLineHeader
457167802Sjkim *
458167802Sjkim * PARAMETERS:  Offset              - Current byte offset, from table start
459167802Sjkim *              ByteLength          - Length of the field in bytes, 0 for flags
460167802Sjkim *              Name                - Name of this field
461167802Sjkim *              Value               - Optional value, displayed on left of ':'
462167802Sjkim *
463167802Sjkim * RETURN:      None
464167802Sjkim *
465167802Sjkim * DESCRIPTION: Utility routines for formatting output lines. Displays the
466167802Sjkim *              current table offset in hex and decimal, the field length,
467167802Sjkim *              and the field name.
468167802Sjkim *
469167802Sjkim ******************************************************************************/
470167802Sjkim
471167802Sjkimvoid
472167802SjkimAcpiDmLineHeader (
473167802Sjkim    UINT32                  Offset,
474167802Sjkim    UINT32                  ByteLength,
475167802Sjkim    char                    *Name)
476167802Sjkim{
477167802Sjkim
478209746Sjkim    if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */
479167802Sjkim    {
480209746Sjkim        if (ByteLength)
481209746Sjkim        {
482209746Sjkim            AcpiOsPrintf ("[%.3d] %34s : ",
483209746Sjkim                ByteLength, Name);
484209746Sjkim        }
485209746Sjkim        else
486209746Sjkim        {
487209746Sjkim            AcpiOsPrintf ("%40s : ",
488209746Sjkim                Name);
489209746Sjkim        }
490167802Sjkim    }
491209746Sjkim    else /* Normal disassembler or verbose template */
492167802Sjkim    {
493209746Sjkim        if (ByteLength)
494209746Sjkim        {
495209746Sjkim            AcpiOsPrintf ("[%3.3Xh %4.4d% 3d] %28s : ",
496209746Sjkim                Offset, Offset, ByteLength, Name);
497209746Sjkim        }
498209746Sjkim        else
499209746Sjkim        {
500209746Sjkim            AcpiOsPrintf ("%43s : ",
501209746Sjkim                Name);
502209746Sjkim        }
503167802Sjkim    }
504167802Sjkim}
505167802Sjkim
506167802Sjkimvoid
507167802SjkimAcpiDmLineHeader2 (
508167802Sjkim    UINT32                  Offset,
509167802Sjkim    UINT32                  ByteLength,
510167802Sjkim    char                    *Name,
511167802Sjkim    UINT32                  Value)
512167802Sjkim{
513167802Sjkim
514209746Sjkim    if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */
515167802Sjkim    {
516209746Sjkim        if (ByteLength)
517209746Sjkim        {
518209746Sjkim            AcpiOsPrintf ("[%.3d] %30s % 3d : ",
519209746Sjkim                ByteLength, Name, Value);
520209746Sjkim        }
521209746Sjkim        else
522209746Sjkim        {
523209746Sjkim            AcpiOsPrintf ("%36s % 3d : ",
524209746Sjkim                Name, Value);
525209746Sjkim        }
526167802Sjkim    }
527209746Sjkim    else /* Normal disassembler or verbose template */
528167802Sjkim    {
529209746Sjkim        if (ByteLength)
530209746Sjkim        {
531209746Sjkim            AcpiOsPrintf ("[%3.3Xh %4.4d% 3d] %24s % 3d : ",
532209746Sjkim                Offset, Offset, ByteLength, Name, Value);
533209746Sjkim        }
534209746Sjkim        else
535209746Sjkim        {
536209746Sjkim            AcpiOsPrintf ("[%3.3Xh %4.4d   ] %24s % 3d : ",
537209746Sjkim                Offset, Offset, Name, Value);
538209746Sjkim        }
539167802Sjkim    }
540167802Sjkim}
541167802Sjkim
542167802Sjkim
543167802Sjkim/*******************************************************************************
544167802Sjkim *
545167802Sjkim * FUNCTION:    AcpiDmDumpTable
546167802Sjkim *
547167802Sjkim * PARAMETERS:  TableLength         - Length of the entire ACPI table
548167802Sjkim *              TableOffset         - Starting offset within the table for this
549167802Sjkim *                                    sub-descriptor (0 if main table)
550167802Sjkim *              Table               - The ACPI table
551193529Sjkim *              SubtableLength      - Length of this sub-descriptor
552167802Sjkim *              Info                - Info table for this ACPI table
553167802Sjkim *
554167802Sjkim * RETURN:      None
555167802Sjkim *
556167802Sjkim * DESCRIPTION: Display ACPI table contents by walking the Info table.
557167802Sjkim *
558209746Sjkim * Note: This function must remain in sync with DtGetFieldLength.
559209746Sjkim *
560167802Sjkim ******************************************************************************/
561167802Sjkim
562193529SjkimACPI_STATUS
563167802SjkimAcpiDmDumpTable (
564167802Sjkim    UINT32                  TableLength,
565167802Sjkim    UINT32                  TableOffset,
566167802Sjkim    void                    *Table,
567167802Sjkim    UINT32                  SubtableLength,
568167802Sjkim    ACPI_DMTABLE_INFO       *Info)
569167802Sjkim{
570167802Sjkim    UINT8                   *Target;
571167802Sjkim    UINT32                  CurrentOffset;
572167802Sjkim    UINT32                  ByteLength;
573167802Sjkim    UINT8                   Temp8;
574167802Sjkim    UINT16                  Temp16;
575167802Sjkim    ACPI_DMTABLE_DATA       *TableData;
576197104Sjkim    const char              *Name;
577193529Sjkim    BOOLEAN                 LastOutputBlankLine = FALSE;
578197104Sjkim    char                    RepairedName[8];
579167802Sjkim
580167802Sjkim
581167802Sjkim    if (!Info)
582167802Sjkim    {
583167802Sjkim        AcpiOsPrintf ("Display not implemented\n");
584193529Sjkim        return (AE_NOT_IMPLEMENTED);
585167802Sjkim    }
586167802Sjkim
587167802Sjkim    /* Walk entire Info table; Null name terminates */
588167802Sjkim
589167802Sjkim    for (; Info->Name; Info++)
590167802Sjkim    {
591167802Sjkim        /*
592167802Sjkim         * Target points to the field within the ACPI Table. CurrentOffset is
593167802Sjkim         * the offset of the field from the start of the main table.
594167802Sjkim         */
595167802Sjkim        Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset);
596167802Sjkim        CurrentOffset = TableOffset + Info->Offset;
597167802Sjkim
598167802Sjkim        /* Check for beyond EOT or beyond subtable end */
599167802Sjkim
600167802Sjkim        if ((CurrentOffset >= TableLength) ||
601167802Sjkim            (SubtableLength && (Info->Offset >= SubtableLength)))
602167802Sjkim        {
603193529Sjkim            AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
604193529Sjkim            return (AE_BAD_DATA);
605167802Sjkim        }
606167802Sjkim
607167802Sjkim        /* Generate the byte length for this field */
608167802Sjkim
609167802Sjkim        switch (Info->Opcode)
610167802Sjkim        {
611167802Sjkim        case ACPI_DMT_UINT8:
612167802Sjkim        case ACPI_DMT_CHKSUM:
613167802Sjkim        case ACPI_DMT_SPACEID:
614216471Sjkim        case ACPI_DMT_ACCWIDTH:
615197104Sjkim        case ACPI_DMT_IVRS:
616167802Sjkim        case ACPI_DMT_MADT:
617167802Sjkim        case ACPI_DMT_SRAT:
618193529Sjkim        case ACPI_DMT_ASF:
619193529Sjkim        case ACPI_DMT_HESTNTYP:
620193529Sjkim        case ACPI_DMT_FADTPM:
621209746Sjkim        case ACPI_DMT_EINJACT:
622209746Sjkim        case ACPI_DMT_EINJINST:
623209746Sjkim        case ACPI_DMT_ERSTACT:
624209746Sjkim        case ACPI_DMT_ERSTINST:
625167802Sjkim            ByteLength = 1;
626167802Sjkim            break;
627167802Sjkim        case ACPI_DMT_UINT16:
628167802Sjkim        case ACPI_DMT_DMAR:
629193529Sjkim        case ACPI_DMT_HEST:
630167802Sjkim            ByteLength = 2;
631167802Sjkim            break;
632167802Sjkim        case ACPI_DMT_UINT24:
633167802Sjkim            ByteLength = 3;
634167802Sjkim            break;
635167802Sjkim        case ACPI_DMT_UINT32:
636167802Sjkim        case ACPI_DMT_NAME4:
637167802Sjkim        case ACPI_DMT_SIG:
638167802Sjkim            ByteLength = 4;
639167802Sjkim            break;
640167802Sjkim        case ACPI_DMT_NAME6:
641167802Sjkim            ByteLength = 6;
642167802Sjkim            break;
643167802Sjkim        case ACPI_DMT_UINT56:
644218590Sjkim        case ACPI_DMT_BUF7:
645167802Sjkim            ByteLength = 7;
646167802Sjkim            break;
647167802Sjkim        case ACPI_DMT_UINT64:
648167802Sjkim        case ACPI_DMT_NAME8:
649167802Sjkim            ByteLength = 8;
650167802Sjkim            break;
651197104Sjkim        case ACPI_DMT_BUF16:
652217365Sjkim        case ACPI_DMT_UUID:
653197104Sjkim            ByteLength = 16;
654197104Sjkim            break;
655167802Sjkim        case ACPI_DMT_STRING:
656167802Sjkim            ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1;
657167802Sjkim            break;
658167802Sjkim        case ACPI_DMT_GAS:
659193529Sjkim            if (!LastOutputBlankLine)
660193529Sjkim            {
661193529Sjkim                AcpiOsPrintf ("\n");
662193529Sjkim                LastOutputBlankLine = TRUE;
663193529Sjkim            }
664167802Sjkim            ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
665167802Sjkim            break;
666193529Sjkim        case ACPI_DMT_HESTNTFY:
667193529Sjkim            if (!LastOutputBlankLine)
668193529Sjkim            {
669193529Sjkim                AcpiOsPrintf ("\n");
670193529Sjkim                LastOutputBlankLine = TRUE;
671193529Sjkim            }
672193529Sjkim            ByteLength = sizeof (ACPI_HEST_NOTIFY);
673193529Sjkim            break;
674167802Sjkim        default:
675167802Sjkim            ByteLength = 0;
676167802Sjkim            break;
677167802Sjkim        }
678167802Sjkim
679193529Sjkim        if (CurrentOffset + ByteLength > TableLength)
680193529Sjkim        {
681193529Sjkim            AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
682193529Sjkim            return (AE_BAD_DATA);
683193529Sjkim        }
684193529Sjkim
685167802Sjkim        /* Start a new line and decode the opcode */
686167802Sjkim
687167802Sjkim        AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name);
688167802Sjkim
689167802Sjkim        switch (Info->Opcode)
690167802Sjkim        {
691167802Sjkim        /* Single-bit Flag fields. Note: Opcode is the bit position */
692167802Sjkim
693167802Sjkim        case ACPI_DMT_FLAG0:
694167802Sjkim        case ACPI_DMT_FLAG1:
695167802Sjkim        case ACPI_DMT_FLAG2:
696167802Sjkim        case ACPI_DMT_FLAG3:
697167802Sjkim        case ACPI_DMT_FLAG4:
698167802Sjkim        case ACPI_DMT_FLAG5:
699167802Sjkim        case ACPI_DMT_FLAG6:
700167802Sjkim        case ACPI_DMT_FLAG7:
701167802Sjkim
702167802Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01);
703167802Sjkim            break;
704167802Sjkim
705167802Sjkim        /* 2-bit Flag fields */
706167802Sjkim
707167802Sjkim        case ACPI_DMT_FLAGS0:
708167802Sjkim
709167802Sjkim            AcpiOsPrintf ("%1.1X\n", *Target & 0x03);
710167802Sjkim            break;
711167802Sjkim
712167802Sjkim        case ACPI_DMT_FLAGS2:
713167802Sjkim
714167802Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03);
715167802Sjkim            break;
716167802Sjkim
717167802Sjkim        /* Standard Data Types */
718167802Sjkim
719167802Sjkim        case ACPI_DMT_UINT8:
720167802Sjkim
721167802Sjkim            AcpiOsPrintf ("%2.2X\n", *Target);
722167802Sjkim            break;
723167802Sjkim
724167802Sjkim        case ACPI_DMT_UINT16:
725167802Sjkim
726167802Sjkim            AcpiOsPrintf ("%4.4X\n", ACPI_GET16 (Target));
727167802Sjkim            break;
728167802Sjkim
729167802Sjkim        case ACPI_DMT_UINT24:
730167802Sjkim
731167802Sjkim            AcpiOsPrintf ("%2.2X%2.2X%2.2X\n",
732167802Sjkim                *Target, *(Target + 1), *(Target + 2));
733167802Sjkim            break;
734167802Sjkim
735167802Sjkim        case ACPI_DMT_UINT32:
736167802Sjkim
737167802Sjkim            AcpiOsPrintf ("%8.8X\n", ACPI_GET32 (Target));
738167802Sjkim            break;
739167802Sjkim
740167802Sjkim        case ACPI_DMT_UINT56:
741167802Sjkim
742193529Sjkim            for (Temp8 = 0; Temp8 < 7; Temp8++)
743193529Sjkim            {
744193529Sjkim                AcpiOsPrintf ("%2.2X", Target[Temp8]);
745193529Sjkim            }
746193529Sjkim            AcpiOsPrintf ("\n");
747167802Sjkim            break;
748167802Sjkim
749167802Sjkim        case ACPI_DMT_UINT64:
750167802Sjkim
751167802Sjkim            AcpiOsPrintf ("%8.8X%8.8X\n",
752167802Sjkim                ACPI_FORMAT_UINT64 (ACPI_GET64 (Target)));
753167802Sjkim            break;
754167802Sjkim
755218590Sjkim        case ACPI_DMT_BUF7:
756197104Sjkim        case ACPI_DMT_BUF16:
757197104Sjkim
758218590Sjkim            /*
759218590Sjkim             * Buffer: Size depends on the opcode and was set above.
760218590Sjkim             * Each hex byte is separated with a space.
761218590Sjkim             */
762218590Sjkim            for (Temp8 = 0; Temp8 < ByteLength; Temp8++)
763197104Sjkim            {
764209746Sjkim                AcpiOsPrintf ("%2.2X", Target[Temp8]);
765218590Sjkim                if ((UINT32) (Temp8 + 1) < ByteLength)
766209746Sjkim                {
767218590Sjkim                    AcpiOsPrintf (" ");
768209746Sjkim                }
769197104Sjkim            }
770197104Sjkim            AcpiOsPrintf ("\n");
771197104Sjkim            break;
772197104Sjkim
773217365Sjkim        case ACPI_DMT_UUID:
774217365Sjkim
775217365Sjkim            /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */
776217365Sjkim
777217365Sjkim            (void) AuConvertUuidToString ((char *) Target, MsgBuffer);
778217365Sjkim
779217365Sjkim            AcpiOsPrintf ("%s\n", MsgBuffer);
780217365Sjkim            break;
781217365Sjkim
782167802Sjkim        case ACPI_DMT_STRING:
783167802Sjkim
784197104Sjkim            AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target));
785167802Sjkim            break;
786167802Sjkim
787167802Sjkim        /* Fixed length ASCII name fields */
788167802Sjkim
789167802Sjkim        case ACPI_DMT_SIG:
790167802Sjkim
791197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 4);
792197104Sjkim            AcpiOsPrintf ("\"%.4s\"    ", RepairedName);
793167802Sjkim            TableData = AcpiDmGetTableData (ACPI_CAST_PTR (char, Target));
794167802Sjkim            if (TableData)
795167802Sjkim            {
796167802Sjkim                AcpiOsPrintf ("/* %s */", TableData->Name);
797167802Sjkim            }
798167802Sjkim            AcpiOsPrintf ("\n");
799167802Sjkim            break;
800167802Sjkim
801167802Sjkim        case ACPI_DMT_NAME4:
802167802Sjkim
803197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 4);
804197104Sjkim            AcpiOsPrintf ("\"%.4s\"\n", RepairedName);
805167802Sjkim            break;
806167802Sjkim
807167802Sjkim        case ACPI_DMT_NAME6:
808167802Sjkim
809197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 6);
810197104Sjkim            AcpiOsPrintf ("\"%.6s\"\n", RepairedName);
811167802Sjkim            break;
812167802Sjkim
813167802Sjkim        case ACPI_DMT_NAME8:
814167802Sjkim
815197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 8);
816197104Sjkim            AcpiOsPrintf ("\"%.8s\"\n", RepairedName);
817167802Sjkim            break;
818167802Sjkim
819167802Sjkim        /* Special Data Types */
820167802Sjkim
821167802Sjkim        case ACPI_DMT_CHKSUM:
822167802Sjkim
823167802Sjkim            /* Checksum, display and validate */
824167802Sjkim
825167802Sjkim            AcpiOsPrintf ("%2.2X", *Target);
826209746Sjkim            Temp8 = AcpiDmGenerateChecksum (Table,
827209746Sjkim                        ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
828209746Sjkim                        ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum);
829167802Sjkim            if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
830167802Sjkim            {
831167802Sjkim                AcpiOsPrintf (
832167802Sjkim                    "     /* Incorrect checksum, should be %2.2X */", Temp8);
833167802Sjkim            }
834167802Sjkim            AcpiOsPrintf ("\n");
835167802Sjkim            break;
836167802Sjkim
837167802Sjkim        case ACPI_DMT_SPACEID:
838167802Sjkim
839167802Sjkim            /* Address Space ID */
840167802Sjkim
841167802Sjkim            AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiUtGetRegionName (*Target));
842167802Sjkim            break;
843167802Sjkim
844216471Sjkim        case ACPI_DMT_ACCWIDTH:
845216471Sjkim
846216471Sjkim            /* Encoded Access Width */
847216471Sjkim
848216471Sjkim            Temp8 = *Target;
849216471Sjkim            if (Temp8 > ACPI_GAS_WIDTH_RESERVED)
850216471Sjkim            {
851216471Sjkim                Temp8 = ACPI_GAS_WIDTH_RESERVED;
852216471Sjkim            }
853216471Sjkim
854216471Sjkim            AcpiOsPrintf ("%2.2X (%s)\n", Temp8, AcpiDmGasAccessWidth[Temp8]);
855216471Sjkim            break;
856216471Sjkim
857167802Sjkim        case ACPI_DMT_GAS:
858167802Sjkim
859167802Sjkim            /* Generic Address Structure */
860167802Sjkim
861167802Sjkim            AcpiOsPrintf ("<Generic Address Structure>\n");
862197104Sjkim            AcpiDmDumpTable (TableLength, CurrentOffset, Target,
863197104Sjkim                sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas);
864193529Sjkim            AcpiOsPrintf ("\n");
865193529Sjkim            LastOutputBlankLine = TRUE;
866167802Sjkim            break;
867167802Sjkim
868193529Sjkim        case ACPI_DMT_ASF:
869193529Sjkim
870193529Sjkim            /* ASF subtable types */
871193529Sjkim
872193529Sjkim            Temp16 = (UINT16) ((*Target) & 0x7F);  /* Top bit can be zero or one */
873193529Sjkim            if (Temp16 > ACPI_ASF_TYPE_RESERVED)
874193529Sjkim            {
875193529Sjkim                Temp16 = ACPI_ASF_TYPE_RESERVED;
876193529Sjkim            }
877193529Sjkim
878193529Sjkim            AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmAsfSubnames[Temp16]);
879193529Sjkim            break;
880193529Sjkim
881167802Sjkim        case ACPI_DMT_DMAR:
882167802Sjkim
883167802Sjkim            /* DMAR subtable types */
884167802Sjkim
885193529Sjkim            Temp16 = ACPI_GET16 (Target);
886167802Sjkim            if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
887167802Sjkim            {
888167802Sjkim                Temp16 = ACPI_DMAR_TYPE_RESERVED;
889167802Sjkim            }
890167802Sjkim
891193529Sjkim            AcpiOsPrintf ("%4.4X <%s>\n", ACPI_GET16 (Target), AcpiDmDmarSubnames[Temp16]);
892167802Sjkim            break;
893167802Sjkim
894209746Sjkim        case ACPI_DMT_EINJACT:
895209746Sjkim
896209746Sjkim            /* EINJ Action types */
897209746Sjkim
898209746Sjkim            Temp8 = *Target;
899209746Sjkim            if (Temp8 > ACPI_EINJ_ACTION_RESERVED)
900209746Sjkim            {
901209746Sjkim                Temp8 = ACPI_EINJ_ACTION_RESERVED;
902209746Sjkim            }
903209746Sjkim
904209746Sjkim            AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmEinjActions[Temp8]);
905209746Sjkim            break;
906209746Sjkim
907209746Sjkim        case ACPI_DMT_EINJINST:
908209746Sjkim
909209746Sjkim            /* EINJ Instruction types */
910209746Sjkim
911209746Sjkim            Temp8 = *Target;
912209746Sjkim            if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED)
913209746Sjkim            {
914209746Sjkim                Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED;
915209746Sjkim            }
916209746Sjkim
917209746Sjkim            AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmEinjInstructions[Temp8]);
918209746Sjkim            break;
919209746Sjkim
920209746Sjkim        case ACPI_DMT_ERSTACT:
921209746Sjkim
922209746Sjkim            /* ERST Action types */
923209746Sjkim
924209746Sjkim            Temp8 = *Target;
925209746Sjkim            if (Temp8 > ACPI_ERST_ACTION_RESERVED)
926209746Sjkim            {
927209746Sjkim                Temp8 = ACPI_ERST_ACTION_RESERVED;
928209746Sjkim            }
929209746Sjkim
930209746Sjkim            AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmErstActions[Temp8]);
931209746Sjkim            break;
932209746Sjkim
933209746Sjkim        case ACPI_DMT_ERSTINST:
934209746Sjkim
935209746Sjkim            /* ERST Instruction types */
936209746Sjkim
937209746Sjkim            Temp8 = *Target;
938209746Sjkim            if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED)
939209746Sjkim            {
940209746Sjkim                Temp8 = ACPI_ERST_INSTRUCTION_RESERVED;
941209746Sjkim            }
942209746Sjkim
943209746Sjkim            AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmErstInstructions[Temp8]);
944209746Sjkim            break;
945209746Sjkim
946193529Sjkim        case ACPI_DMT_HEST:
947193529Sjkim
948193529Sjkim            /* HEST subtable types */
949193529Sjkim
950193529Sjkim            Temp16 = ACPI_GET16 (Target);
951193529Sjkim            if (Temp16 > ACPI_HEST_TYPE_RESERVED)
952193529Sjkim            {
953193529Sjkim                Temp16 = ACPI_HEST_TYPE_RESERVED;
954193529Sjkim            }
955193529Sjkim
956193529Sjkim            AcpiOsPrintf ("%4.4X (%s)\n", ACPI_GET16 (Target), AcpiDmHestSubnames[Temp16]);
957193529Sjkim            break;
958193529Sjkim
959193529Sjkim        case ACPI_DMT_HESTNTFY:
960193529Sjkim
961193529Sjkim            AcpiOsPrintf ("<Hardware Error Notification Structure>\n");
962197104Sjkim            AcpiDmDumpTable (TableLength, CurrentOffset, Target,
963197104Sjkim                sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify);
964193529Sjkim            AcpiOsPrintf ("\n");
965193529Sjkim            LastOutputBlankLine = TRUE;
966193529Sjkim            break;
967193529Sjkim
968193529Sjkim        case ACPI_DMT_HESTNTYP:
969193529Sjkim
970193529Sjkim            /* HEST Notify types */
971193529Sjkim
972193529Sjkim            Temp8 = *Target;
973193529Sjkim            if (Temp8 > ACPI_HEST_NOTIFY_RESERVED)
974193529Sjkim            {
975193529Sjkim                Temp8 = ACPI_HEST_NOTIFY_RESERVED;
976193529Sjkim            }
977193529Sjkim
978193529Sjkim            AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmHestNotifySubnames[Temp8]);
979193529Sjkim            break;
980193529Sjkim
981167802Sjkim        case ACPI_DMT_MADT:
982167802Sjkim
983167802Sjkim            /* MADT subtable types */
984167802Sjkim
985167802Sjkim            Temp8 = *Target;
986167802Sjkim            if (Temp8 > ACPI_MADT_TYPE_RESERVED)
987167802Sjkim            {
988167802Sjkim                Temp8 = ACPI_MADT_TYPE_RESERVED;
989167802Sjkim            }
990167802Sjkim
991167802Sjkim            AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmMadtSubnames[Temp8]);
992167802Sjkim            break;
993167802Sjkim
994167802Sjkim        case ACPI_DMT_SRAT:
995167802Sjkim
996167802Sjkim            /* SRAT subtable types */
997167802Sjkim
998167802Sjkim            Temp8 = *Target;
999167802Sjkim            if (Temp8 > ACPI_SRAT_TYPE_RESERVED)
1000167802Sjkim            {
1001167802Sjkim                Temp8 = ACPI_SRAT_TYPE_RESERVED;
1002167802Sjkim            }
1003167802Sjkim
1004167802Sjkim            AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmSratSubnames[Temp8]);
1005167802Sjkim            break;
1006167802Sjkim
1007193529Sjkim        case ACPI_DMT_FADTPM:
1008193529Sjkim
1009193529Sjkim            /* FADT Preferred PM Profile names */
1010193529Sjkim
1011193529Sjkim            Temp8 = *Target;
1012193529Sjkim            if (Temp8 > ACPI_FADT_PM_RESERVED)
1013193529Sjkim            {
1014193529Sjkim                Temp8 = ACPI_FADT_PM_RESERVED;
1015193529Sjkim            }
1016193529Sjkim
1017193529Sjkim            AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmFadtProfiles[Temp8]);
1018193529Sjkim            break;
1019193529Sjkim
1020197104Sjkim        case ACPI_DMT_IVRS:
1021197104Sjkim
1022197104Sjkim            /* IVRS subtable types */
1023197104Sjkim
1024197104Sjkim            Temp8 = *Target;
1025197104Sjkim            switch (Temp8)
1026197104Sjkim            {
1027197104Sjkim            case ACPI_IVRS_TYPE_HARDWARE:
1028197104Sjkim                Name = AcpiDmIvrsSubnames[0];
1029197104Sjkim                break;
1030197104Sjkim
1031197104Sjkim            case ACPI_IVRS_TYPE_MEMORY1:
1032197104Sjkim            case ACPI_IVRS_TYPE_MEMORY2:
1033197104Sjkim            case ACPI_IVRS_TYPE_MEMORY3:
1034197104Sjkim                Name = AcpiDmIvrsSubnames[1];
1035197104Sjkim                break;
1036197104Sjkim
1037197104Sjkim            default:
1038197104Sjkim                Name = AcpiDmIvrsSubnames[2];
1039197104Sjkim                break;
1040197104Sjkim            }
1041197104Sjkim
1042197104Sjkim            AcpiOsPrintf ("%2.2X <%s>\n", *Target, Name);
1043197104Sjkim            break;
1044197104Sjkim
1045167802Sjkim        case ACPI_DMT_EXIT:
1046193529Sjkim            return (AE_OK);
1047167802Sjkim
1048167802Sjkim        default:
1049167802Sjkim            ACPI_ERROR ((AE_INFO,
1050204773Sjkim                "**** Invalid table opcode [0x%X] ****\n", Info->Opcode));
1051193529Sjkim            return (AE_SUPPORT);
1052167802Sjkim        }
1053167802Sjkim    }
1054193529Sjkim
1055193529Sjkim    if (TableOffset && !SubtableLength)
1056193529Sjkim    {
1057193529Sjkim        /* If this table is not the main table, subtable must have valid length */
1058193529Sjkim
1059193529Sjkim        AcpiOsPrintf ("Invalid zero length subtable\n");
1060193529Sjkim        return (AE_BAD_DATA);
1061193529Sjkim    }
1062193529Sjkim
1063193529Sjkim    return (AE_OK);
1064167802Sjkim}
1065167802Sjkim
1066167802Sjkim
1067167802Sjkim/*******************************************************************************
1068167802Sjkim *
1069167802Sjkim * FUNCTION:    AcpiDmCheckAscii
1070167802Sjkim *
1071167802Sjkim * PARAMETERS:  Name                - Ascii string
1072167802Sjkim *              Count               - Number of characters to check
1073167802Sjkim *
1074167802Sjkim * RETURN:      None
1075167802Sjkim *
1076167802Sjkim * DESCRIPTION: Ensure that the requested number of characters are printable
1077167802Sjkim *              Ascii characters. Sets non-printable and null chars to <space>.
1078167802Sjkim *
1079167802Sjkim ******************************************************************************/
1080167802Sjkim
1081167802Sjkimstatic void
1082167802SjkimAcpiDmCheckAscii (
1083167802Sjkim    UINT8                   *Name,
1084197104Sjkim    char                    *RepairedName,
1085167802Sjkim    UINT32                  Count)
1086167802Sjkim{
1087167802Sjkim    UINT32                  i;
1088167802Sjkim
1089167802Sjkim
1090167802Sjkim    for (i = 0; i < Count; i++)
1091167802Sjkim    {
1092198237Sjkim        RepairedName[i] = (char) Name[i];
1093197104Sjkim
1094197104Sjkim        if (!Name[i])
1095167802Sjkim        {
1096197104Sjkim            return;
1097167802Sjkim        }
1098197104Sjkim        if (!isprint (Name[i]))
1099197104Sjkim        {
1100197104Sjkim            RepairedName[i] = ' ';
1101197104Sjkim        }
1102167802Sjkim    }
1103167802Sjkim}
1104