dmtable.c revision 216471
1167802Sjkim/******************************************************************************
2167802Sjkim *
3167802Sjkim * Module Name: dmtable - Support for ACPI tables that contain no AML code
4167802Sjkim *
5167802Sjkim *****************************************************************************/
6167802Sjkim
7167802Sjkim/******************************************************************************
8167802Sjkim *
9167802Sjkim * 1. Copyright Notice
10167802Sjkim *
11202771Sjkim * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
12167802Sjkim * All rights reserved.
13167802Sjkim *
14167802Sjkim * 2. License
15167802Sjkim *
16167802Sjkim * 2.1. This is your license from Intel Corp. under its intellectual property
17167802Sjkim * rights.  You may have additional license terms from the party that provided
18167802Sjkim * you this software, covering your right to use that party's intellectual
19167802Sjkim * property rights.
20167802Sjkim *
21167802Sjkim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22167802Sjkim * copy of the source code appearing in this file ("Covered Code") an
23167802Sjkim * irrevocable, perpetual, worldwide license under Intel's copyrights in the
24167802Sjkim * base code distributed originally by Intel ("Original Intel Code") to copy,
25167802Sjkim * make derivatives, distribute, use and display any portion of the Covered
26167802Sjkim * Code in any form, with the right to sublicense such rights; and
27167802Sjkim *
28167802Sjkim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29167802Sjkim * license (with the right to sublicense), under only those claims of Intel
30167802Sjkim * patents that are infringed by the Original Intel Code, to make, use, sell,
31167802Sjkim * offer to sell, and import the Covered Code and derivative works thereof
32167802Sjkim * solely to the minimum extent necessary to exercise the above copyright
33167802Sjkim * license, and in no event shall the patent license extend to any additions
34167802Sjkim * to or modifications of the Original Intel Code.  No other license or right
35167802Sjkim * is granted directly or by implication, estoppel or otherwise;
36167802Sjkim *
37167802Sjkim * The above copyright and patent license is granted only if the following
38167802Sjkim * conditions are met:
39167802Sjkim *
40167802Sjkim * 3. Conditions
41167802Sjkim *
42167802Sjkim * 3.1. Redistribution of Source with Rights to Further Distribute Source.
43167802Sjkim * Redistribution of source code of any substantial portion of the Covered
44167802Sjkim * Code or modification with rights to further distribute source must include
45167802Sjkim * the above Copyright Notice, the above License, this list of Conditions,
46167802Sjkim * and the following Disclaimer and Export Compliance provision.  In addition,
47167802Sjkim * Licensee must cause all Covered Code to which Licensee contributes to
48167802Sjkim * contain a file documenting the changes Licensee made to create that Covered
49167802Sjkim * Code and the date of any change.  Licensee must include in that file the
50167802Sjkim * documentation of any changes made by any predecessor Licensee.  Licensee
51167802Sjkim * must include a prominent statement that the modification is derived,
52167802Sjkim * directly or indirectly, from Original Intel Code.
53167802Sjkim *
54167802Sjkim * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55167802Sjkim * Redistribution of source code of any substantial portion of the Covered
56167802Sjkim * Code or modification without rights to further distribute source must
57167802Sjkim * include the following Disclaimer and Export Compliance provision in the
58167802Sjkim * documentation and/or other materials provided with distribution.  In
59167802Sjkim * addition, Licensee may not authorize further sublicense of source of any
60167802Sjkim * portion of the Covered Code, and must include terms to the effect that the
61167802Sjkim * license from Licensee to its licensee is limited to the intellectual
62167802Sjkim * property embodied in the software Licensee provides to its licensee, and
63167802Sjkim * not to intellectual property embodied in modifications its licensee may
64167802Sjkim * make.
65167802Sjkim *
66167802Sjkim * 3.3. Redistribution of Executable. Redistribution in executable form of any
67167802Sjkim * substantial portion of the Covered Code or modification must reproduce the
68167802Sjkim * above Copyright Notice, and the following Disclaimer and Export Compliance
69167802Sjkim * provision in the documentation and/or other materials provided with the
70167802Sjkim * distribution.
71167802Sjkim *
72167802Sjkim * 3.4. Intel retains all right, title, and interest in and to the Original
73167802Sjkim * Intel Code.
74167802Sjkim *
75167802Sjkim * 3.5. Neither the name Intel nor any other trademark owned or controlled by
76167802Sjkim * Intel shall be used in advertising or otherwise to promote the sale, use or
77167802Sjkim * other dealings in products derived from or relating to the Covered Code
78167802Sjkim * without prior written authorization from Intel.
79167802Sjkim *
80167802Sjkim * 4. Disclaimer and Export Compliance
81167802Sjkim *
82167802Sjkim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83167802Sjkim * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84167802Sjkim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
85167802Sjkim * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
86167802Sjkim * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
87167802Sjkim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88167802Sjkim * PARTICULAR PURPOSE.
89167802Sjkim *
90167802Sjkim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91167802Sjkim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92167802Sjkim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93167802Sjkim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94167802Sjkim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95167802Sjkim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
96167802Sjkim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97167802Sjkim * LIMITED REMEDY.
98167802Sjkim *
99167802Sjkim * 4.3. Licensee shall not export, either directly or indirectly, any of this
100167802Sjkim * software or system incorporating such software without first obtaining any
101167802Sjkim * required license or other approval from the U. S. Department of Commerce or
102167802Sjkim * any other agency or department of the United States Government.  In the
103167802Sjkim * event Licensee exports any such software from the United States or
104167802Sjkim * re-exports any such software from a foreign destination, Licensee shall
105167802Sjkim * ensure that the distribution and export/re-export of the software is in
106167802Sjkim * compliance with all laws, regulations, orders, or other restrictions of the
107167802Sjkim * U.S. Export Administration Regulations. Licensee agrees that neither it nor
108167802Sjkim * any of its subsidiaries will export/re-export any technical data, process,
109167802Sjkim * software, or service, directly or indirectly, to any country for which the
110167802Sjkim * United States government or any agency thereof requires an export license,
111167802Sjkim * other governmental approval, or letter of assurance, without first obtaining
112167802Sjkim * such license, approval or letter.
113167802Sjkim *
114167802Sjkim *****************************************************************************/
115167802Sjkim
116193529Sjkim#include <contrib/dev/acpica/include/acpi.h>
117193529Sjkim#include <contrib/dev/acpica/include/accommon.h>
118193529Sjkim#include <contrib/dev/acpica/include/acdisasm.h>
119193529Sjkim#include <contrib/dev/acpica/include/actables.h>
120209746Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
121209746Sjkim#include <contrib/dev/acpica/compiler/dtcompiler.h>
122167802Sjkim
123167802Sjkim/* This module used for application-level code only */
124167802Sjkim
125167802Sjkim#define _COMPONENT          ACPI_CA_DISASSEMBLER
126167802Sjkim        ACPI_MODULE_NAME    ("dmtable")
127167802Sjkim
128167802Sjkim/* Local Prototypes */
129167802Sjkim
130167802Sjkimstatic void
131167802SjkimAcpiDmCheckAscii (
132167802Sjkim    UINT8                   *Target,
133197104Sjkim    char                    *RepairedName,
134167802Sjkim    UINT32                  Count);
135167802Sjkim
136167802Sjkim
137167802Sjkim/* These tables map a subtable type to a description string */
138167802Sjkim
139193529Sjkimstatic const char           *AcpiDmAsfSubnames[] =
140193529Sjkim{
141193529Sjkim    "ASF Information",
142193529Sjkim    "ASF Alerts",
143193529Sjkim    "ASF Remote Control",
144193529Sjkim    "ASF RMCP Boot Options",
145193529Sjkim    "ASF Address",
146193529Sjkim    "Unknown SubTable Type"         /* Reserved */
147193529Sjkim};
148193529Sjkim
149167802Sjkimstatic const char           *AcpiDmDmarSubnames[] =
150167802Sjkim{
151167802Sjkim    "Hardware Unit Definition",
152167802Sjkim    "Reserved Memory Region",
153193529Sjkim    "Root Port ATS Capability",
154197104Sjkim    "Remapping Hardware Static Affinity",
155167802Sjkim    "Unknown SubTable Type"         /* Reserved */
156167802Sjkim};
157167802Sjkim
158209746Sjkimstatic const char           *AcpiDmEinjActions[] =
159209746Sjkim{
160209746Sjkim    "Begin Operation",
161209746Sjkim    "Get Trigger Table",
162209746Sjkim    "Set Error Type",
163209746Sjkim    "Get Error Type",
164209746Sjkim    "End Operation",
165209746Sjkim    "Execute Operation",
166209746Sjkim    "Check Busy Status",
167209746Sjkim    "Get Command Status",
168209746Sjkim    "Unknown Action"
169209746Sjkim};
170209746Sjkim
171209746Sjkimstatic const char           *AcpiDmEinjInstructions[] =
172209746Sjkim{
173209746Sjkim    "Read Register",
174209746Sjkim    "Read Register Value",
175209746Sjkim    "Write Register",
176209746Sjkim    "Write Register Value",
177209746Sjkim    "Noop",
178209746Sjkim    "Unknown Instruction"
179209746Sjkim};
180209746Sjkim
181209746Sjkimstatic const char           *AcpiDmErstActions[] =
182209746Sjkim{
183209746Sjkim    "Begin Write Operation",
184209746Sjkim    "Begin Read Operation",
185209746Sjkim    "Begin Clear Operation",
186209746Sjkim    "End Operation",
187209746Sjkim    "Set Record Offset",
188209746Sjkim    "Execute Operation",
189209746Sjkim    "Check Busy Status",
190209746Sjkim    "Get Command Status",
191209746Sjkim    "Get Record Identifier",
192209746Sjkim    "Set Record Identifier",
193209746Sjkim    "Get Record Count",
194209746Sjkim    "Begin Dummy Write",
195209746Sjkim    "Unused/Unknown Action",
196209746Sjkim    "Get Error Address Range",
197209746Sjkim    "Get Error Address Length",
198209746Sjkim    "Get Error Attributes",
199209746Sjkim    "Unknown Action"
200209746Sjkim};
201209746Sjkim
202209746Sjkimstatic const char           *AcpiDmErstInstructions[] =
203209746Sjkim{
204209746Sjkim    "Read Register",
205209746Sjkim    "Read Register Value",
206209746Sjkim    "Write Register",
207209746Sjkim    "Write Register Value",
208209746Sjkim    "Noop",
209209746Sjkim    "Load Var1",
210209746Sjkim    "Load Var2",
211209746Sjkim    "Store Var1",
212209746Sjkim    "Add",
213209746Sjkim    "Subtract",
214209746Sjkim    "Add Value",
215209746Sjkim    "Subtract Value",
216209746Sjkim    "Stall",
217209746Sjkim    "Stall While True",
218209746Sjkim    "Skip Next If True",
219209746Sjkim    "GoTo",
220209746Sjkim    "Set Source Address",
221209746Sjkim    "Set Destination Address",
222209746Sjkim    "Move Data",
223209746Sjkim    "Unknown Instruction"
224209746Sjkim};
225209746Sjkim
226193529Sjkimstatic const char           *AcpiDmHestSubnames[] =
227193529Sjkim{
228197104Sjkim    "IA-32 Machine Check Exception",
229197104Sjkim    "IA-32 Corrected Machine Check",
230197104Sjkim    "IA-32 Non-Maskable Interrupt",
231197104Sjkim    "Unknown SubTable Type",        /* 3 - Reserved */
232197104Sjkim    "Unknown SubTable Type",        /* 4 - Reserved */
233197104Sjkim    "Unknown SubTable Type",        /* 5 - Reserved */
234193529Sjkim    "PCI Express Root Port AER",
235193529Sjkim    "PCI Express AER (AER Endpoint)",
236193529Sjkim    "PCI Express/PCI-X Bridge AER",
237193529Sjkim    "Generic Hardware Error Source",
238193529Sjkim    "Unknown SubTable Type"         /* Reserved */
239193529Sjkim};
240193529Sjkim
241193529Sjkimstatic const char           *AcpiDmHestNotifySubnames[] =
242193529Sjkim{
243193529Sjkim    "Polled",
244193529Sjkim    "External Interrupt",
245193529Sjkim    "Local Interrupt",
246193529Sjkim    "SCI",
247193529Sjkim    "NMI",
248193529Sjkim    "Unknown Notify Type"           /* Reserved */
249193529Sjkim};
250193529Sjkim
251167802Sjkimstatic const char           *AcpiDmMadtSubnames[] =
252167802Sjkim{
253167802Sjkim    "Processor Local APIC",         /* ACPI_MADT_TYPE_LOCAL_APIC */
254167802Sjkim    "I/O APIC",                     /* ACPI_MADT_TYPE_IO_APIC */
255167802Sjkim    "Interrupt Source Override",    /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */
256167802Sjkim    "NMI Source",                   /* ACPI_MADT_TYPE_NMI_SOURCE */
257167802Sjkim    "Local APIC NMI",               /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */
258167802Sjkim    "Local APIC Address Override",  /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */
259167802Sjkim    "I/O SAPIC",                    /* ACPI_MADT_TYPE_IO_SAPIC */
260167802Sjkim    "Local SAPIC",                  /* ACPI_MADT_TYPE_LOCAL_SAPIC */
261167802Sjkim    "Platform Interrupt Sources",   /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */
262193529Sjkim    "Processor Local x2APIC",       /* ACPI_MADT_TYPE_LOCAL_X2APIC */
263193529Sjkim    "Local x2APIC NMI",             /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */
264167802Sjkim    "Unknown SubTable Type"         /* Reserved */
265167802Sjkim};
266167802Sjkim
267167802Sjkimstatic const char           *AcpiDmSratSubnames[] =
268167802Sjkim{
269167802Sjkim    "Processor Local APIC/SAPIC Affinity",
270167802Sjkim    "Memory Affinity",
271193529Sjkim    "Processor Local x2APIC Affinity",
272167802Sjkim    "Unknown SubTable Type"         /* Reserved */
273167802Sjkim};
274167802Sjkim
275197104Sjkimstatic const char           *AcpiDmIvrsSubnames[] =
276197104Sjkim{
277197104Sjkim    "Hardware Definition Block",
278197104Sjkim    "Memory Definition Block",
279197104Sjkim    "Unknown SubTable Type"         /* Reserved */
280197104Sjkim};
281167802Sjkim
282197104Sjkim
283193529Sjkim#define ACPI_FADT_PM_RESERVED       8
284193529Sjkim
285193529Sjkimstatic const char           *AcpiDmFadtProfiles[] =
286193529Sjkim{
287193529Sjkim    "Unspecified",
288193529Sjkim    "Desktop",
289193529Sjkim    "Mobile",
290193529Sjkim    "Workstation",
291193529Sjkim    "Enterprise Server",
292193529Sjkim    "SOHO Server",
293193529Sjkim    "Appliance PC",
294193529Sjkim    "Performance Server",
295193529Sjkim    "Unknown Profile Type"
296193529Sjkim};
297193529Sjkim
298216471Sjkim#define ACPI_GAS_WIDTH_RESERVED     5
299216471Sjkim
300216471Sjkimstatic const char           *AcpiDmGasAccessWidth[] =
301216471Sjkim{
302216471Sjkim    "Undefined/Legacy",
303216471Sjkim    "Byte Access:8",
304216471Sjkim    "Word Access:16",
305216471Sjkim    "DWord Access:32",
306216471Sjkim    "QWord Access:64",
307216471Sjkim    "Unknown Width Encoding"
308216471Sjkim};
309216471Sjkim
310216471Sjkim
311167802Sjkim/*******************************************************************************
312167802Sjkim *
313167802Sjkim * ACPI Table Data, indexed by signature.
314167802Sjkim *
315209746Sjkim * Each entry contains: Signature, Table Info, Handler, DtHandler,
316209746Sjkim *  Template, Description
317197104Sjkim *
318209746Sjkim * Simple tables have only a TableInfo structure, complex tables have a
319209746Sjkim * handler. This table must be NULL terminated. RSDP and FACS are
320209746Sjkim * special-cased elsewhere.
321167802Sjkim *
322167802Sjkim ******************************************************************************/
323167802Sjkim
324209746SjkimACPI_DMTABLE_DATA    AcpiDmTableData[] =
325167802Sjkim{
326209746Sjkim    {ACPI_SIG_ASF,  NULL,                   AcpiDmDumpAsf,  DtCompileAsf,   TemplateAsf,    "Alert Standard Format table"},
327209746Sjkim    {ACPI_SIG_BOOT, AcpiDmTableInfoBoot,    NULL,           NULL,           TemplateBoot,   "Simple Boot Flag Table"},
328209746Sjkim    {ACPI_SIG_BERT, AcpiDmTableInfoBert,    NULL,           NULL,           TemplateBert,   "Boot Error Record Table"},
329209746Sjkim    {ACPI_SIG_CPEP, NULL,                   AcpiDmDumpCpep, DtCompileCpep,  TemplateCpep,   "Corrected Platform Error Polling table"},
330209746Sjkim    {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp,    NULL,           NULL,           TemplateDbgp,   "Debug Port table"},
331209746Sjkim    {ACPI_SIG_DMAR, NULL,                   AcpiDmDumpDmar, DtCompileDmar,  TemplateDmar,   "DMA Remapping table"},
332209746Sjkim    {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt,    NULL,           NULL,           TemplateEcdt,   "Embedded Controller Boot Resources Table"},
333209746Sjkim    {ACPI_SIG_EINJ, NULL,                   AcpiDmDumpEinj, DtCompileEinj,  TemplateEinj,   "Error Injection table"},
334209746Sjkim    {ACPI_SIG_ERST, NULL,                   AcpiDmDumpErst, DtCompileErst,  TemplateErst,   "Error Record Serialization Table"},
335209746Sjkim    {ACPI_SIG_FADT, NULL,                   AcpiDmDumpFadt, DtCompileFadt,  TemplateFadt,   "Fixed ACPI Description Table"},
336209746Sjkim    {ACPI_SIG_HEST, NULL,                   AcpiDmDumpHest, DtCompileHest,  TemplateHest,   "Hardware Error Source Table"},
337209746Sjkim    {ACPI_SIG_HPET, AcpiDmTableInfoHpet,    NULL,           NULL,           TemplateHpet,   "High Precision Event Timer table"},
338209746Sjkim    {ACPI_SIG_IVRS, NULL,                   AcpiDmDumpIvrs, DtCompileIvrs,  TemplateIvrs,   "I/O Virtualization Reporting Structure"},
339209746Sjkim    {ACPI_SIG_MADT, NULL,                   AcpiDmDumpMadt, DtCompileMadt,  TemplateMadt,   "Multiple APIC Description Table"},
340209746Sjkim    {ACPI_SIG_MCFG, NULL,                   AcpiDmDumpMcfg, DtCompileMcfg,  TemplateMcfg,   "Memory Mapped Configuration table"},
341209746Sjkim    {ACPI_SIG_MCHI, AcpiDmTableInfoMchi,    NULL,           NULL,           TemplateMchi,   "Management Controller Host Interface table"},
342209746Sjkim    {ACPI_SIG_MSCT, NULL,                   AcpiDmDumpMsct, DtCompileMsct,  TemplateMsct,   "Maximum System Characteristics Table"},
343209746Sjkim    {ACPI_SIG_RSDT, NULL,                   AcpiDmDumpRsdt, DtCompileRsdt,  TemplateRsdt,   "Root System Description Table"},
344209746Sjkim    {ACPI_SIG_SBST, AcpiDmTableInfoSbst,    NULL,           NULL,           TemplateSbst,   "Smart Battery Specification Table"},
345209746Sjkim    {ACPI_SIG_SLIC, AcpiDmTableInfoSlic,    NULL,           NULL,           NULL,           "Software Licensing Description Table"},
346209746Sjkim    {ACPI_SIG_SLIT, NULL,                   AcpiDmDumpSlit, DtCompileSlit,  TemplateSlit,   "System Locality Information Table"},
347209746Sjkim    {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr,    NULL,           NULL,           TemplateSpcr,   "Serial Port Console Redirection table"},
348209746Sjkim    {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi,    NULL,           NULL,           TemplateSpmi,   "Server Platform Management Interface table"},
349209746Sjkim    {ACPI_SIG_SRAT, NULL,                   AcpiDmDumpSrat, DtCompileSrat,  TemplateSrat,   "System Resource Affinity Table"},
350209746Sjkim    {ACPI_SIG_TCPA, AcpiDmTableInfoTcpa,    NULL,           NULL,           TemplateTcpa,   "Trusted Computing Platform Alliance table"},
351209746Sjkim    {ACPI_SIG_UEFI, AcpiDmTableInfoUefi,    NULL,           NULL,           TemplateUefi,   "UEFI Boot Optimization Table"},
352209746Sjkim    {ACPI_SIG_WAET, AcpiDmTableInfoWaet,    NULL,           NULL,           TemplateWaet,   "Windows ACPI Emulated Devices Table"},
353209746Sjkim    {ACPI_SIG_WDAT, NULL,                   AcpiDmDumpWdat, DtCompileWdat,  TemplateWdat,   "Watchdog Action Table"},
354209746Sjkim    {ACPI_SIG_WDDT, AcpiDmTableInfoWddt,    NULL,           NULL,           TemplateWddt,   "Watchdog Description Table"},
355209746Sjkim    {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt,    NULL,           NULL,           TemplateWdrt,   "Watchdog Resource Table"},
356209746Sjkim    {ACPI_SIG_XSDT, NULL,                   AcpiDmDumpXsdt, DtCompileXsdt,  TemplateXsdt,   "Extended System Description Table"},
357209746Sjkim    {NULL,          NULL,                   NULL,           NULL,           NULL,           NULL}
358167802Sjkim};
359167802Sjkim
360167802Sjkim
361167802Sjkim/*******************************************************************************
362167802Sjkim *
363209746Sjkim * FUNCTION:    AcpiDmGenerateChecksum
364167802Sjkim *
365209746Sjkim * PARAMETERS:  Table               - Pointer to table to be checksummed
366209746Sjkim *              Length              - Length of the table
367209746Sjkim *              OriginalChecksum    - Value of the checksum field
368167802Sjkim *
369167802Sjkim * RETURN:      8 bit checksum of buffer
370167802Sjkim *
371167802Sjkim * DESCRIPTION: Computes an 8 bit checksum of the table.
372167802Sjkim *
373167802Sjkim ******************************************************************************/
374167802Sjkim
375167802SjkimUINT8
376209746SjkimAcpiDmGenerateChecksum (
377209746Sjkim    void                    *Table,
378209746Sjkim    UINT32                  Length,
379209746Sjkim    UINT8                   OriginalChecksum)
380167802Sjkim{
381167802Sjkim    UINT8                   Checksum;
382167802Sjkim
383167802Sjkim
384167802Sjkim    /* Sum the entire table as-is */
385167802Sjkim
386209746Sjkim    Checksum = AcpiTbChecksum ((UINT8 *) Table, Length);
387167802Sjkim
388167802Sjkim    /* Subtract off the existing checksum value in the table */
389167802Sjkim
390209746Sjkim    Checksum = (UINT8) (Checksum - OriginalChecksum);
391167802Sjkim
392167802Sjkim    /* Compute the final checksum */
393167802Sjkim
394167802Sjkim    Checksum = (UINT8) (0 - Checksum);
395167802Sjkim    return (Checksum);
396167802Sjkim}
397167802Sjkim
398167802Sjkim
399167802Sjkim/*******************************************************************************
400167802Sjkim *
401167802Sjkim * FUNCTION:    AcpiDmGetTableData
402167802Sjkim *
403167802Sjkim * PARAMETERS:  Signature           - ACPI signature (4 chars) to match
404167802Sjkim *
405167802Sjkim * RETURN:      Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found.
406167802Sjkim *
407167802Sjkim * DESCRIPTION: Find a match in the global table of supported ACPI tables
408167802Sjkim *
409167802Sjkim ******************************************************************************/
410167802Sjkim
411209746SjkimACPI_DMTABLE_DATA *
412167802SjkimAcpiDmGetTableData (
413167802Sjkim    char                    *Signature)
414167802Sjkim{
415167802Sjkim    ACPI_DMTABLE_DATA       *TableData;
416167802Sjkim
417167802Sjkim
418167802Sjkim    for (TableData = AcpiDmTableData; TableData->Signature; TableData++)
419167802Sjkim    {
420167802Sjkim        if (ACPI_COMPARE_NAME (Signature, TableData->Signature))
421167802Sjkim        {
422167802Sjkim            return (TableData);
423167802Sjkim        }
424167802Sjkim    }
425167802Sjkim
426167802Sjkim    return (NULL);
427167802Sjkim}
428167802Sjkim
429167802Sjkim
430167802Sjkim/*******************************************************************************
431167802Sjkim *
432167802Sjkim * FUNCTION:    AcpiDmDumpDataTable
433167802Sjkim *
434167802Sjkim * PARAMETERS:  Table               - An ACPI table
435167802Sjkim *
436167802Sjkim * RETURN:      None.
437167802Sjkim *
438167802Sjkim * DESCRIPTION: Format the contents of an ACPI data table (any table other
439167802Sjkim *              than an SSDT or DSDT that does not contain executable AML code)
440167802Sjkim *
441167802Sjkim ******************************************************************************/
442167802Sjkim
443167802Sjkimvoid
444167802SjkimAcpiDmDumpDataTable (
445167802Sjkim    ACPI_TABLE_HEADER       *Table)
446167802Sjkim{
447193529Sjkim    ACPI_STATUS             Status;
448167802Sjkim    ACPI_DMTABLE_DATA       *TableData;
449167802Sjkim    UINT32                  Length;
450167802Sjkim
451167802Sjkim
452167802Sjkim    /* Ignore tables that contain AML */
453167802Sjkim
454167802Sjkim    if (AcpiUtIsAmlTable (Table))
455167802Sjkim    {
456167802Sjkim        return;
457167802Sjkim    }
458167802Sjkim
459167802Sjkim    /*
460167802Sjkim     * Handle tables that don't use the common ACPI table header structure.
461167802Sjkim     * Currently, these are the FACS and RSDP.
462167802Sjkim     */
463167802Sjkim    if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS))
464167802Sjkim    {
465167802Sjkim        Length = Table->Length;
466167802Sjkim        AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs);
467167802Sjkim    }
468167802Sjkim    else if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_RSDP))
469167802Sjkim    {
470167802Sjkim        Length = AcpiDmDumpRsdp (Table);
471167802Sjkim    }
472167802Sjkim    else
473167802Sjkim    {
474167802Sjkim        /*
475167802Sjkim         * All other tables must use the common ACPI table header, dump it now
476167802Sjkim         */
477167802Sjkim        Length = Table->Length;
478193529Sjkim        Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader);
479193529Sjkim        if (ACPI_FAILURE (Status))
480193529Sjkim        {
481193529Sjkim            return;
482193529Sjkim        }
483167802Sjkim        AcpiOsPrintf ("\n");
484167802Sjkim
485167802Sjkim        /* Match signature and dispatch appropriately */
486167802Sjkim
487167802Sjkim        TableData = AcpiDmGetTableData (Table->Signature);
488167802Sjkim        if (!TableData)
489167802Sjkim        {
490167802Sjkim            if (!ACPI_STRNCMP (Table->Signature, "OEM", 3))
491167802Sjkim            {
492167802Sjkim                AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n",
493167802Sjkim                    Table->Signature);
494167802Sjkim            }
495167802Sjkim            else
496167802Sjkim            {
497167802Sjkim                AcpiOsPrintf ("\n**** Unknown ACPI table type [%4.4s]\n\n",
498167802Sjkim                    Table->Signature);
499167802Sjkim            }
500167802Sjkim        }
501167802Sjkim        else if (TableData->TableHandler)
502167802Sjkim        {
503167802Sjkim            /* Complex table, has a handler */
504167802Sjkim
505167802Sjkim            TableData->TableHandler (Table);
506167802Sjkim        }
507167802Sjkim        else if (TableData->TableInfo)
508167802Sjkim        {
509167802Sjkim            /* Simple table, just walk the info table */
510167802Sjkim
511167802Sjkim            AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo);
512167802Sjkim        }
513167802Sjkim    }
514167802Sjkim
515209746Sjkim    if (!Gbl_DoTemplates || Gbl_VerboseTemplates)
516209746Sjkim    {
517209746Sjkim        /* Dump the raw table data */
518167802Sjkim
519209746Sjkim        AcpiOsPrintf ("\nRaw Table Data\n\n");
520209746Sjkim        AcpiUtDumpBuffer2 (ACPI_CAST_PTR (UINT8, Table), Length, DB_BYTE_DISPLAY);
521209746Sjkim    }
522167802Sjkim}
523167802Sjkim
524167802Sjkim
525167802Sjkim/*******************************************************************************
526167802Sjkim *
527167802Sjkim * FUNCTION:    AcpiDmLineHeader
528167802Sjkim *
529167802Sjkim * PARAMETERS:  Offset              - Current byte offset, from table start
530167802Sjkim *              ByteLength          - Length of the field in bytes, 0 for flags
531167802Sjkim *              Name                - Name of this field
532167802Sjkim *              Value               - Optional value, displayed on left of ':'
533167802Sjkim *
534167802Sjkim * RETURN:      None
535167802Sjkim *
536167802Sjkim * DESCRIPTION: Utility routines for formatting output lines. Displays the
537167802Sjkim *              current table offset in hex and decimal, the field length,
538167802Sjkim *              and the field name.
539167802Sjkim *
540167802Sjkim ******************************************************************************/
541167802Sjkim
542167802Sjkimvoid
543167802SjkimAcpiDmLineHeader (
544167802Sjkim    UINT32                  Offset,
545167802Sjkim    UINT32                  ByteLength,
546167802Sjkim    char                    *Name)
547167802Sjkim{
548167802Sjkim
549209746Sjkim    if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */
550167802Sjkim    {
551209746Sjkim        if (ByteLength)
552209746Sjkim        {
553209746Sjkim            AcpiOsPrintf ("[%.3d] %34s : ",
554209746Sjkim                ByteLength, Name);
555209746Sjkim        }
556209746Sjkim        else
557209746Sjkim        {
558209746Sjkim            AcpiOsPrintf ("%40s : ",
559209746Sjkim                Name);
560209746Sjkim        }
561167802Sjkim    }
562209746Sjkim    else /* Normal disassembler or verbose template */
563167802Sjkim    {
564209746Sjkim        if (ByteLength)
565209746Sjkim        {
566209746Sjkim            AcpiOsPrintf ("[%3.3Xh %4.4d% 3d] %28s : ",
567209746Sjkim                Offset, Offset, ByteLength, Name);
568209746Sjkim        }
569209746Sjkim        else
570209746Sjkim        {
571209746Sjkim            AcpiOsPrintf ("%43s : ",
572209746Sjkim                Name);
573209746Sjkim        }
574167802Sjkim    }
575167802Sjkim}
576167802Sjkim
577167802Sjkimvoid
578167802SjkimAcpiDmLineHeader2 (
579167802Sjkim    UINT32                  Offset,
580167802Sjkim    UINT32                  ByteLength,
581167802Sjkim    char                    *Name,
582167802Sjkim    UINT32                  Value)
583167802Sjkim{
584167802Sjkim
585209746Sjkim    if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */
586167802Sjkim    {
587209746Sjkim        if (ByteLength)
588209746Sjkim        {
589209746Sjkim            AcpiOsPrintf ("[%.3d] %30s % 3d : ",
590209746Sjkim                ByteLength, Name, Value);
591209746Sjkim        }
592209746Sjkim        else
593209746Sjkim        {
594209746Sjkim            AcpiOsPrintf ("%36s % 3d : ",
595209746Sjkim                Name, Value);
596209746Sjkim        }
597167802Sjkim    }
598209746Sjkim    else /* Normal disassembler or verbose template */
599167802Sjkim    {
600209746Sjkim        if (ByteLength)
601209746Sjkim        {
602209746Sjkim            AcpiOsPrintf ("[%3.3Xh %4.4d% 3d] %24s % 3d : ",
603209746Sjkim                Offset, Offset, ByteLength, Name, Value);
604209746Sjkim        }
605209746Sjkim        else
606209746Sjkim        {
607209746Sjkim            AcpiOsPrintf ("[%3.3Xh %4.4d   ] %24s % 3d : ",
608209746Sjkim                Offset, Offset, Name, Value);
609209746Sjkim        }
610167802Sjkim    }
611167802Sjkim}
612167802Sjkim
613167802Sjkim
614167802Sjkim/*******************************************************************************
615167802Sjkim *
616167802Sjkim * FUNCTION:    AcpiDmDumpTable
617167802Sjkim *
618167802Sjkim * PARAMETERS:  TableLength         - Length of the entire ACPI table
619167802Sjkim *              TableOffset         - Starting offset within the table for this
620167802Sjkim *                                    sub-descriptor (0 if main table)
621167802Sjkim *              Table               - The ACPI table
622193529Sjkim *              SubtableLength      - Length of this sub-descriptor
623167802Sjkim *              Info                - Info table for this ACPI table
624167802Sjkim *
625167802Sjkim * RETURN:      None
626167802Sjkim *
627167802Sjkim * DESCRIPTION: Display ACPI table contents by walking the Info table.
628167802Sjkim *
629209746Sjkim * Note: This function must remain in sync with DtGetFieldLength.
630209746Sjkim *
631167802Sjkim ******************************************************************************/
632167802Sjkim
633193529SjkimACPI_STATUS
634167802SjkimAcpiDmDumpTable (
635167802Sjkim    UINT32                  TableLength,
636167802Sjkim    UINT32                  TableOffset,
637167802Sjkim    void                    *Table,
638167802Sjkim    UINT32                  SubtableLength,
639167802Sjkim    ACPI_DMTABLE_INFO       *Info)
640167802Sjkim{
641167802Sjkim    UINT8                   *Target;
642167802Sjkim    UINT32                  CurrentOffset;
643167802Sjkim    UINT32                  ByteLength;
644167802Sjkim    UINT8                   Temp8;
645167802Sjkim    UINT16                  Temp16;
646167802Sjkim    ACPI_DMTABLE_DATA       *TableData;
647197104Sjkim    const char              *Name;
648193529Sjkim    BOOLEAN                 LastOutputBlankLine = FALSE;
649197104Sjkim    char                    RepairedName[8];
650167802Sjkim
651167802Sjkim
652167802Sjkim    if (!Info)
653167802Sjkim    {
654167802Sjkim        AcpiOsPrintf ("Display not implemented\n");
655193529Sjkim        return (AE_NOT_IMPLEMENTED);
656167802Sjkim    }
657167802Sjkim
658167802Sjkim    /* Walk entire Info table; Null name terminates */
659167802Sjkim
660167802Sjkim    for (; Info->Name; Info++)
661167802Sjkim    {
662167802Sjkim        /*
663167802Sjkim         * Target points to the field within the ACPI Table. CurrentOffset is
664167802Sjkim         * the offset of the field from the start of the main table.
665167802Sjkim         */
666167802Sjkim        Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset);
667167802Sjkim        CurrentOffset = TableOffset + Info->Offset;
668167802Sjkim
669167802Sjkim        /* Check for beyond EOT or beyond subtable end */
670167802Sjkim
671167802Sjkim        if ((CurrentOffset >= TableLength) ||
672167802Sjkim            (SubtableLength && (Info->Offset >= SubtableLength)))
673167802Sjkim        {
674193529Sjkim            AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
675193529Sjkim            return (AE_BAD_DATA);
676167802Sjkim        }
677167802Sjkim
678167802Sjkim        /* Generate the byte length for this field */
679167802Sjkim
680167802Sjkim        switch (Info->Opcode)
681167802Sjkim        {
682167802Sjkim        case ACPI_DMT_UINT8:
683167802Sjkim        case ACPI_DMT_CHKSUM:
684167802Sjkim        case ACPI_DMT_SPACEID:
685216471Sjkim        case ACPI_DMT_ACCWIDTH:
686197104Sjkim        case ACPI_DMT_IVRS:
687167802Sjkim        case ACPI_DMT_MADT:
688167802Sjkim        case ACPI_DMT_SRAT:
689193529Sjkim        case ACPI_DMT_ASF:
690193529Sjkim        case ACPI_DMT_HESTNTYP:
691193529Sjkim        case ACPI_DMT_FADTPM:
692209746Sjkim        case ACPI_DMT_EINJACT:
693209746Sjkim        case ACPI_DMT_EINJINST:
694209746Sjkim        case ACPI_DMT_ERSTACT:
695209746Sjkim        case ACPI_DMT_ERSTINST:
696167802Sjkim            ByteLength = 1;
697167802Sjkim            break;
698167802Sjkim        case ACPI_DMT_UINT16:
699167802Sjkim        case ACPI_DMT_DMAR:
700193529Sjkim        case ACPI_DMT_HEST:
701167802Sjkim            ByteLength = 2;
702167802Sjkim            break;
703167802Sjkim        case ACPI_DMT_UINT24:
704167802Sjkim            ByteLength = 3;
705167802Sjkim            break;
706167802Sjkim        case ACPI_DMT_UINT32:
707167802Sjkim        case ACPI_DMT_NAME4:
708167802Sjkim        case ACPI_DMT_SIG:
709167802Sjkim            ByteLength = 4;
710167802Sjkim            break;
711167802Sjkim        case ACPI_DMT_NAME6:
712167802Sjkim            ByteLength = 6;
713167802Sjkim            break;
714167802Sjkim        case ACPI_DMT_UINT56:
715167802Sjkim            ByteLength = 7;
716167802Sjkim            break;
717167802Sjkim        case ACPI_DMT_UINT64:
718167802Sjkim        case ACPI_DMT_NAME8:
719167802Sjkim            ByteLength = 8;
720167802Sjkim            break;
721197104Sjkim        case ACPI_DMT_BUF16:
722197104Sjkim            ByteLength = 16;
723197104Sjkim            break;
724167802Sjkim        case ACPI_DMT_STRING:
725167802Sjkim            ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1;
726167802Sjkim            break;
727167802Sjkim        case ACPI_DMT_GAS:
728193529Sjkim            if (!LastOutputBlankLine)
729193529Sjkim            {
730193529Sjkim                AcpiOsPrintf ("\n");
731193529Sjkim                LastOutputBlankLine = TRUE;
732193529Sjkim            }
733167802Sjkim            ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
734167802Sjkim            break;
735193529Sjkim        case ACPI_DMT_HESTNTFY:
736193529Sjkim            if (!LastOutputBlankLine)
737193529Sjkim            {
738193529Sjkim                AcpiOsPrintf ("\n");
739193529Sjkim                LastOutputBlankLine = TRUE;
740193529Sjkim            }
741193529Sjkim            ByteLength = sizeof (ACPI_HEST_NOTIFY);
742193529Sjkim            break;
743167802Sjkim        default:
744167802Sjkim            ByteLength = 0;
745167802Sjkim            break;
746167802Sjkim        }
747167802Sjkim
748193529Sjkim        if (CurrentOffset + ByteLength > TableLength)
749193529Sjkim        {
750193529Sjkim            AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
751193529Sjkim            return (AE_BAD_DATA);
752193529Sjkim        }
753193529Sjkim
754167802Sjkim        /* Start a new line and decode the opcode */
755167802Sjkim
756167802Sjkim        AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name);
757167802Sjkim
758167802Sjkim        switch (Info->Opcode)
759167802Sjkim        {
760167802Sjkim        /* Single-bit Flag fields. Note: Opcode is the bit position */
761167802Sjkim
762167802Sjkim        case ACPI_DMT_FLAG0:
763167802Sjkim        case ACPI_DMT_FLAG1:
764167802Sjkim        case ACPI_DMT_FLAG2:
765167802Sjkim        case ACPI_DMT_FLAG3:
766167802Sjkim        case ACPI_DMT_FLAG4:
767167802Sjkim        case ACPI_DMT_FLAG5:
768167802Sjkim        case ACPI_DMT_FLAG6:
769167802Sjkim        case ACPI_DMT_FLAG7:
770167802Sjkim
771167802Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01);
772167802Sjkim            break;
773167802Sjkim
774167802Sjkim        /* 2-bit Flag fields */
775167802Sjkim
776167802Sjkim        case ACPI_DMT_FLAGS0:
777167802Sjkim
778167802Sjkim            AcpiOsPrintf ("%1.1X\n", *Target & 0x03);
779167802Sjkim            break;
780167802Sjkim
781167802Sjkim        case ACPI_DMT_FLAGS2:
782167802Sjkim
783167802Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03);
784167802Sjkim            break;
785167802Sjkim
786167802Sjkim        /* Standard Data Types */
787167802Sjkim
788167802Sjkim        case ACPI_DMT_UINT8:
789167802Sjkim
790167802Sjkim            AcpiOsPrintf ("%2.2X\n", *Target);
791167802Sjkim            break;
792167802Sjkim
793167802Sjkim        case ACPI_DMT_UINT16:
794167802Sjkim
795167802Sjkim            AcpiOsPrintf ("%4.4X\n", ACPI_GET16 (Target));
796167802Sjkim            break;
797167802Sjkim
798167802Sjkim        case ACPI_DMT_UINT24:
799167802Sjkim
800167802Sjkim            AcpiOsPrintf ("%2.2X%2.2X%2.2X\n",
801167802Sjkim                *Target, *(Target + 1), *(Target + 2));
802167802Sjkim            break;
803167802Sjkim
804167802Sjkim        case ACPI_DMT_UINT32:
805167802Sjkim
806167802Sjkim            AcpiOsPrintf ("%8.8X\n", ACPI_GET32 (Target));
807167802Sjkim            break;
808167802Sjkim
809167802Sjkim        case ACPI_DMT_UINT56:
810167802Sjkim
811193529Sjkim            for (Temp8 = 0; Temp8 < 7; Temp8++)
812193529Sjkim            {
813193529Sjkim                AcpiOsPrintf ("%2.2X", Target[Temp8]);
814193529Sjkim            }
815193529Sjkim            AcpiOsPrintf ("\n");
816167802Sjkim            break;
817167802Sjkim
818167802Sjkim        case ACPI_DMT_UINT64:
819167802Sjkim
820167802Sjkim            AcpiOsPrintf ("%8.8X%8.8X\n",
821167802Sjkim                ACPI_FORMAT_UINT64 (ACPI_GET64 (Target)));
822167802Sjkim            break;
823167802Sjkim
824197104Sjkim        case ACPI_DMT_BUF16:
825197104Sjkim
826197104Sjkim            /* Buffer of length 16 */
827197104Sjkim
828197104Sjkim            for (Temp8 = 0; Temp8 < 16; Temp8++)
829197104Sjkim            {
830209746Sjkim                AcpiOsPrintf ("%2.2X", Target[Temp8]);
831209746Sjkim                if ((Temp8 + 1) < 16)
832209746Sjkim                {
833209746Sjkim                    AcpiOsPrintf (",");
834209746Sjkim                }
835197104Sjkim            }
836197104Sjkim            AcpiOsPrintf ("\n");
837197104Sjkim            break;
838197104Sjkim
839167802Sjkim        case ACPI_DMT_STRING:
840167802Sjkim
841197104Sjkim            AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target));
842167802Sjkim            break;
843167802Sjkim
844167802Sjkim        /* Fixed length ASCII name fields */
845167802Sjkim
846167802Sjkim        case ACPI_DMT_SIG:
847167802Sjkim
848197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 4);
849197104Sjkim            AcpiOsPrintf ("\"%.4s\"    ", RepairedName);
850167802Sjkim            TableData = AcpiDmGetTableData (ACPI_CAST_PTR (char, Target));
851167802Sjkim            if (TableData)
852167802Sjkim            {
853167802Sjkim                AcpiOsPrintf ("/* %s */", TableData->Name);
854167802Sjkim            }
855167802Sjkim            AcpiOsPrintf ("\n");
856167802Sjkim            break;
857167802Sjkim
858167802Sjkim        case ACPI_DMT_NAME4:
859167802Sjkim
860197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 4);
861197104Sjkim            AcpiOsPrintf ("\"%.4s\"\n", RepairedName);
862167802Sjkim            break;
863167802Sjkim
864167802Sjkim        case ACPI_DMT_NAME6:
865167802Sjkim
866197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 6);
867197104Sjkim            AcpiOsPrintf ("\"%.6s\"\n", RepairedName);
868167802Sjkim            break;
869167802Sjkim
870167802Sjkim        case ACPI_DMT_NAME8:
871167802Sjkim
872197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 8);
873197104Sjkim            AcpiOsPrintf ("\"%.8s\"\n", RepairedName);
874167802Sjkim            break;
875167802Sjkim
876167802Sjkim        /* Special Data Types */
877167802Sjkim
878167802Sjkim        case ACPI_DMT_CHKSUM:
879167802Sjkim
880167802Sjkim            /* Checksum, display and validate */
881167802Sjkim
882167802Sjkim            AcpiOsPrintf ("%2.2X", *Target);
883209746Sjkim            Temp8 = AcpiDmGenerateChecksum (Table,
884209746Sjkim                        ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
885209746Sjkim                        ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum);
886167802Sjkim            if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
887167802Sjkim            {
888167802Sjkim                AcpiOsPrintf (
889167802Sjkim                    "     /* Incorrect checksum, should be %2.2X */", Temp8);
890167802Sjkim            }
891167802Sjkim            AcpiOsPrintf ("\n");
892167802Sjkim            break;
893167802Sjkim
894167802Sjkim        case ACPI_DMT_SPACEID:
895167802Sjkim
896167802Sjkim            /* Address Space ID */
897167802Sjkim
898167802Sjkim            AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiUtGetRegionName (*Target));
899167802Sjkim            break;
900167802Sjkim
901216471Sjkim        case ACPI_DMT_ACCWIDTH:
902216471Sjkim
903216471Sjkim            /* Encoded Access Width */
904216471Sjkim
905216471Sjkim            Temp8 = *Target;
906216471Sjkim            if (Temp8 > ACPI_GAS_WIDTH_RESERVED)
907216471Sjkim            {
908216471Sjkim                Temp8 = ACPI_GAS_WIDTH_RESERVED;
909216471Sjkim            }
910216471Sjkim
911216471Sjkim            AcpiOsPrintf ("%2.2X (%s)\n", Temp8, AcpiDmGasAccessWidth[Temp8]);
912216471Sjkim            break;
913216471Sjkim
914167802Sjkim        case ACPI_DMT_GAS:
915167802Sjkim
916167802Sjkim            /* Generic Address Structure */
917167802Sjkim
918167802Sjkim            AcpiOsPrintf ("<Generic Address Structure>\n");
919197104Sjkim            AcpiDmDumpTable (TableLength, CurrentOffset, Target,
920197104Sjkim                sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas);
921193529Sjkim            AcpiOsPrintf ("\n");
922193529Sjkim            LastOutputBlankLine = TRUE;
923167802Sjkim            break;
924167802Sjkim
925193529Sjkim        case ACPI_DMT_ASF:
926193529Sjkim
927193529Sjkim            /* ASF subtable types */
928193529Sjkim
929193529Sjkim            Temp16 = (UINT16) ((*Target) & 0x7F);  /* Top bit can be zero or one */
930193529Sjkim            if (Temp16 > ACPI_ASF_TYPE_RESERVED)
931193529Sjkim            {
932193529Sjkim                Temp16 = ACPI_ASF_TYPE_RESERVED;
933193529Sjkim            }
934193529Sjkim
935193529Sjkim            AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmAsfSubnames[Temp16]);
936193529Sjkim            break;
937193529Sjkim
938167802Sjkim        case ACPI_DMT_DMAR:
939167802Sjkim
940167802Sjkim            /* DMAR subtable types */
941167802Sjkim
942193529Sjkim            Temp16 = ACPI_GET16 (Target);
943167802Sjkim            if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
944167802Sjkim            {
945167802Sjkim                Temp16 = ACPI_DMAR_TYPE_RESERVED;
946167802Sjkim            }
947167802Sjkim
948193529Sjkim            AcpiOsPrintf ("%4.4X <%s>\n", ACPI_GET16 (Target), AcpiDmDmarSubnames[Temp16]);
949167802Sjkim            break;
950167802Sjkim
951209746Sjkim        case ACPI_DMT_EINJACT:
952209746Sjkim
953209746Sjkim            /* EINJ Action types */
954209746Sjkim
955209746Sjkim            Temp8 = *Target;
956209746Sjkim            if (Temp8 > ACPI_EINJ_ACTION_RESERVED)
957209746Sjkim            {
958209746Sjkim                Temp8 = ACPI_EINJ_ACTION_RESERVED;
959209746Sjkim            }
960209746Sjkim
961209746Sjkim            AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmEinjActions[Temp8]);
962209746Sjkim            break;
963209746Sjkim
964209746Sjkim        case ACPI_DMT_EINJINST:
965209746Sjkim
966209746Sjkim            /* EINJ Instruction types */
967209746Sjkim
968209746Sjkim            Temp8 = *Target;
969209746Sjkim            if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED)
970209746Sjkim            {
971209746Sjkim                Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED;
972209746Sjkim            }
973209746Sjkim
974209746Sjkim            AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmEinjInstructions[Temp8]);
975209746Sjkim            break;
976209746Sjkim
977209746Sjkim        case ACPI_DMT_ERSTACT:
978209746Sjkim
979209746Sjkim            /* ERST Action types */
980209746Sjkim
981209746Sjkim            Temp8 = *Target;
982209746Sjkim            if (Temp8 > ACPI_ERST_ACTION_RESERVED)
983209746Sjkim            {
984209746Sjkim                Temp8 = ACPI_ERST_ACTION_RESERVED;
985209746Sjkim            }
986209746Sjkim
987209746Sjkim            AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmErstActions[Temp8]);
988209746Sjkim            break;
989209746Sjkim
990209746Sjkim        case ACPI_DMT_ERSTINST:
991209746Sjkim
992209746Sjkim            /* ERST Instruction types */
993209746Sjkim
994209746Sjkim            Temp8 = *Target;
995209746Sjkim            if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED)
996209746Sjkim            {
997209746Sjkim                Temp8 = ACPI_ERST_INSTRUCTION_RESERVED;
998209746Sjkim            }
999209746Sjkim
1000209746Sjkim            AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmErstInstructions[Temp8]);
1001209746Sjkim            break;
1002209746Sjkim
1003193529Sjkim        case ACPI_DMT_HEST:
1004193529Sjkim
1005193529Sjkim            /* HEST subtable types */
1006193529Sjkim
1007193529Sjkim            Temp16 = ACPI_GET16 (Target);
1008193529Sjkim            if (Temp16 > ACPI_HEST_TYPE_RESERVED)
1009193529Sjkim            {
1010193529Sjkim                Temp16 = ACPI_HEST_TYPE_RESERVED;
1011193529Sjkim            }
1012193529Sjkim
1013193529Sjkim            AcpiOsPrintf ("%4.4X (%s)\n", ACPI_GET16 (Target), AcpiDmHestSubnames[Temp16]);
1014193529Sjkim            break;
1015193529Sjkim
1016193529Sjkim        case ACPI_DMT_HESTNTFY:
1017193529Sjkim
1018193529Sjkim            AcpiOsPrintf ("<Hardware Error Notification Structure>\n");
1019197104Sjkim            AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1020197104Sjkim                sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify);
1021193529Sjkim            AcpiOsPrintf ("\n");
1022193529Sjkim            LastOutputBlankLine = TRUE;
1023193529Sjkim            break;
1024193529Sjkim
1025193529Sjkim        case ACPI_DMT_HESTNTYP:
1026193529Sjkim
1027193529Sjkim            /* HEST Notify types */
1028193529Sjkim
1029193529Sjkim            Temp8 = *Target;
1030193529Sjkim            if (Temp8 > ACPI_HEST_NOTIFY_RESERVED)
1031193529Sjkim            {
1032193529Sjkim                Temp8 = ACPI_HEST_NOTIFY_RESERVED;
1033193529Sjkim            }
1034193529Sjkim
1035193529Sjkim            AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmHestNotifySubnames[Temp8]);
1036193529Sjkim            break;
1037193529Sjkim
1038167802Sjkim        case ACPI_DMT_MADT:
1039167802Sjkim
1040167802Sjkim            /* MADT subtable types */
1041167802Sjkim
1042167802Sjkim            Temp8 = *Target;
1043167802Sjkim            if (Temp8 > ACPI_MADT_TYPE_RESERVED)
1044167802Sjkim            {
1045167802Sjkim                Temp8 = ACPI_MADT_TYPE_RESERVED;
1046167802Sjkim            }
1047167802Sjkim
1048167802Sjkim            AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmMadtSubnames[Temp8]);
1049167802Sjkim            break;
1050167802Sjkim
1051167802Sjkim        case ACPI_DMT_SRAT:
1052167802Sjkim
1053167802Sjkim            /* SRAT subtable types */
1054167802Sjkim
1055167802Sjkim            Temp8 = *Target;
1056167802Sjkim            if (Temp8 > ACPI_SRAT_TYPE_RESERVED)
1057167802Sjkim            {
1058167802Sjkim                Temp8 = ACPI_SRAT_TYPE_RESERVED;
1059167802Sjkim            }
1060167802Sjkim
1061167802Sjkim            AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmSratSubnames[Temp8]);
1062167802Sjkim            break;
1063167802Sjkim
1064193529Sjkim        case ACPI_DMT_FADTPM:
1065193529Sjkim
1066193529Sjkim            /* FADT Preferred PM Profile names */
1067193529Sjkim
1068193529Sjkim            Temp8 = *Target;
1069193529Sjkim            if (Temp8 > ACPI_FADT_PM_RESERVED)
1070193529Sjkim            {
1071193529Sjkim                Temp8 = ACPI_FADT_PM_RESERVED;
1072193529Sjkim            }
1073193529Sjkim
1074193529Sjkim            AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiDmFadtProfiles[Temp8]);
1075193529Sjkim            break;
1076193529Sjkim
1077197104Sjkim        case ACPI_DMT_IVRS:
1078197104Sjkim
1079197104Sjkim            /* IVRS subtable types */
1080197104Sjkim
1081197104Sjkim            Temp8 = *Target;
1082197104Sjkim            switch (Temp8)
1083197104Sjkim            {
1084197104Sjkim            case ACPI_IVRS_TYPE_HARDWARE:
1085197104Sjkim                Name = AcpiDmIvrsSubnames[0];
1086197104Sjkim                break;
1087197104Sjkim
1088197104Sjkim            case ACPI_IVRS_TYPE_MEMORY1:
1089197104Sjkim            case ACPI_IVRS_TYPE_MEMORY2:
1090197104Sjkim            case ACPI_IVRS_TYPE_MEMORY3:
1091197104Sjkim                Name = AcpiDmIvrsSubnames[1];
1092197104Sjkim                break;
1093197104Sjkim
1094197104Sjkim            default:
1095197104Sjkim                Name = AcpiDmIvrsSubnames[2];
1096197104Sjkim                break;
1097197104Sjkim            }
1098197104Sjkim
1099197104Sjkim            AcpiOsPrintf ("%2.2X <%s>\n", *Target, Name);
1100197104Sjkim            break;
1101197104Sjkim
1102167802Sjkim        case ACPI_DMT_EXIT:
1103193529Sjkim            return (AE_OK);
1104167802Sjkim
1105167802Sjkim        default:
1106167802Sjkim            ACPI_ERROR ((AE_INFO,
1107204773Sjkim                "**** Invalid table opcode [0x%X] ****\n", Info->Opcode));
1108193529Sjkim            return (AE_SUPPORT);
1109167802Sjkim        }
1110167802Sjkim    }
1111193529Sjkim
1112193529Sjkim    if (TableOffset && !SubtableLength)
1113193529Sjkim    {
1114193529Sjkim        /* If this table is not the main table, subtable must have valid length */
1115193529Sjkim
1116193529Sjkim        AcpiOsPrintf ("Invalid zero length subtable\n");
1117193529Sjkim        return (AE_BAD_DATA);
1118193529Sjkim    }
1119193529Sjkim
1120193529Sjkim    return (AE_OK);
1121167802Sjkim}
1122167802Sjkim
1123167802Sjkim
1124167802Sjkim/*******************************************************************************
1125167802Sjkim *
1126167802Sjkim * FUNCTION:    AcpiDmCheckAscii
1127167802Sjkim *
1128167802Sjkim * PARAMETERS:  Name                - Ascii string
1129167802Sjkim *              Count               - Number of characters to check
1130167802Sjkim *
1131167802Sjkim * RETURN:      None
1132167802Sjkim *
1133167802Sjkim * DESCRIPTION: Ensure that the requested number of characters are printable
1134167802Sjkim *              Ascii characters. Sets non-printable and null chars to <space>.
1135167802Sjkim *
1136167802Sjkim ******************************************************************************/
1137167802Sjkim
1138167802Sjkimstatic void
1139167802SjkimAcpiDmCheckAscii (
1140167802Sjkim    UINT8                   *Name,
1141197104Sjkim    char                    *RepairedName,
1142167802Sjkim    UINT32                  Count)
1143167802Sjkim{
1144167802Sjkim    UINT32                  i;
1145167802Sjkim
1146167802Sjkim
1147167802Sjkim    for (i = 0; i < Count; i++)
1148167802Sjkim    {
1149198237Sjkim        RepairedName[i] = (char) Name[i];
1150197104Sjkim
1151197104Sjkim        if (!Name[i])
1152167802Sjkim        {
1153197104Sjkim            return;
1154167802Sjkim        }
1155197104Sjkim        if (!isprint (Name[i]))
1156197104Sjkim        {
1157197104Sjkim            RepairedName[i] = ' ';
1158197104Sjkim        }
1159167802Sjkim    }
1160167802Sjkim}
1161