dmtable.c revision 246849
1167802Sjkim/******************************************************************************
2167802Sjkim *
3167802Sjkim * Module Name: dmtable - Support for ACPI tables that contain no AML code
4167802Sjkim *
5167802Sjkim *****************************************************************************/
6167802Sjkim
7217365Sjkim/*
8245582Sjkim * Copyright (C) 2000 - 2013, Intel Corp.
9167802Sjkim * All rights reserved.
10167802Sjkim *
11217365Sjkim * Redistribution and use in source and binary forms, with or without
12217365Sjkim * modification, are permitted provided that the following conditions
13217365Sjkim * are met:
14217365Sjkim * 1. Redistributions of source code must retain the above copyright
15217365Sjkim *    notice, this list of conditions, and the following disclaimer,
16217365Sjkim *    without modification.
17217365Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18217365Sjkim *    substantially similar to the "NO WARRANTY" disclaimer below
19217365Sjkim *    ("Disclaimer") and any redistribution must be conditioned upon
20217365Sjkim *    including a substantially similar Disclaimer requirement for further
21217365Sjkim *    binary redistribution.
22217365Sjkim * 3. Neither the names of the above-listed copyright holders nor the names
23217365Sjkim *    of any contributors may be used to endorse or promote products derived
24217365Sjkim *    from this software without specific prior written permission.
25167802Sjkim *
26217365Sjkim * Alternatively, this software may be distributed under the terms of the
27217365Sjkim * GNU General Public License ("GPL") version 2 as published by the Free
28217365Sjkim * Software Foundation.
29167802Sjkim *
30217365Sjkim * NO WARRANTY
31217365Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32217365Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33217365Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34217365Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35217365Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36217365Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37217365Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38217365Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39217365Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40217365Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41217365Sjkim * POSSIBILITY OF SUCH DAMAGES.
42217365Sjkim */
43167802Sjkim
44193529Sjkim#include <contrib/dev/acpica/include/acpi.h>
45193529Sjkim#include <contrib/dev/acpica/include/accommon.h>
46193529Sjkim#include <contrib/dev/acpica/include/acdisasm.h>
47193529Sjkim#include <contrib/dev/acpica/include/actables.h>
48209746Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h>
49209746Sjkim#include <contrib/dev/acpica/compiler/dtcompiler.h>
50167802Sjkim
51167802Sjkim/* This module used for application-level code only */
52167802Sjkim
53167802Sjkim#define _COMPONENT          ACPI_CA_DISASSEMBLER
54167802Sjkim        ACPI_MODULE_NAME    ("dmtable")
55167802Sjkim
56167802Sjkim/* Local Prototypes */
57167802Sjkim
58167802Sjkimstatic void
59167802SjkimAcpiDmCheckAscii (
60167802Sjkim    UINT8                   *Target,
61197104Sjkim    char                    *RepairedName,
62167802Sjkim    UINT32                  Count);
63167802Sjkim
64167802Sjkim
65220663Sjkim/* Common format strings for commented values */
66220663Sjkim
67220663Sjkim#define UINT8_FORMAT        "%2.2X [%s]\n"
68220663Sjkim#define UINT16_FORMAT       "%4.4X [%s]\n"
69220663Sjkim#define UINT32_FORMAT       "%8.8X [%s]\n"
70220663Sjkim#define STRING_FORMAT       "[%s]\n"
71220663Sjkim
72167802Sjkim/* These tables map a subtable type to a description string */
73167802Sjkim
74193529Sjkimstatic const char           *AcpiDmAsfSubnames[] =
75193529Sjkim{
76193529Sjkim    "ASF Information",
77193529Sjkim    "ASF Alerts",
78193529Sjkim    "ASF Remote Control",
79193529Sjkim    "ASF RMCP Boot Options",
80193529Sjkim    "ASF Address",
81193529Sjkim    "Unknown SubTable Type"         /* Reserved */
82193529Sjkim};
83193529Sjkim
84167802Sjkimstatic const char           *AcpiDmDmarSubnames[] =
85167802Sjkim{
86167802Sjkim    "Hardware Unit Definition",
87167802Sjkim    "Reserved Memory Region",
88193529Sjkim    "Root Port ATS Capability",
89197104Sjkim    "Remapping Hardware Static Affinity",
90167802Sjkim    "Unknown SubTable Type"         /* Reserved */
91167802Sjkim};
92167802Sjkim
93209746Sjkimstatic const char           *AcpiDmEinjActions[] =
94209746Sjkim{
95209746Sjkim    "Begin Operation",
96209746Sjkim    "Get Trigger Table",
97209746Sjkim    "Set Error Type",
98209746Sjkim    "Get Error Type",
99209746Sjkim    "End Operation",
100209746Sjkim    "Execute Operation",
101209746Sjkim    "Check Busy Status",
102209746Sjkim    "Get Command Status",
103209746Sjkim    "Unknown Action"
104209746Sjkim};
105209746Sjkim
106209746Sjkimstatic const char           *AcpiDmEinjInstructions[] =
107209746Sjkim{
108209746Sjkim    "Read Register",
109209746Sjkim    "Read Register Value",
110209746Sjkim    "Write Register",
111209746Sjkim    "Write Register Value",
112209746Sjkim    "Noop",
113209746Sjkim    "Unknown Instruction"
114209746Sjkim};
115209746Sjkim
116209746Sjkimstatic const char           *AcpiDmErstActions[] =
117209746Sjkim{
118209746Sjkim    "Begin Write Operation",
119209746Sjkim    "Begin Read Operation",
120209746Sjkim    "Begin Clear Operation",
121209746Sjkim    "End Operation",
122209746Sjkim    "Set Record Offset",
123209746Sjkim    "Execute Operation",
124209746Sjkim    "Check Busy Status",
125209746Sjkim    "Get Command Status",
126209746Sjkim    "Get Record Identifier",
127209746Sjkim    "Set Record Identifier",
128209746Sjkim    "Get Record Count",
129209746Sjkim    "Begin Dummy Write",
130209746Sjkim    "Unused/Unknown Action",
131209746Sjkim    "Get Error Address Range",
132209746Sjkim    "Get Error Address Length",
133209746Sjkim    "Get Error Attributes",
134209746Sjkim    "Unknown Action"
135209746Sjkim};
136209746Sjkim
137209746Sjkimstatic const char           *AcpiDmErstInstructions[] =
138209746Sjkim{
139209746Sjkim    "Read Register",
140209746Sjkim    "Read Register Value",
141209746Sjkim    "Write Register",
142209746Sjkim    "Write Register Value",
143209746Sjkim    "Noop",
144209746Sjkim    "Load Var1",
145209746Sjkim    "Load Var2",
146209746Sjkim    "Store Var1",
147209746Sjkim    "Add",
148209746Sjkim    "Subtract",
149209746Sjkim    "Add Value",
150209746Sjkim    "Subtract Value",
151209746Sjkim    "Stall",
152209746Sjkim    "Stall While True",
153209746Sjkim    "Skip Next If True",
154209746Sjkim    "GoTo",
155209746Sjkim    "Set Source Address",
156209746Sjkim    "Set Destination Address",
157209746Sjkim    "Move Data",
158209746Sjkim    "Unknown Instruction"
159209746Sjkim};
160209746Sjkim
161193529Sjkimstatic const char           *AcpiDmHestSubnames[] =
162193529Sjkim{
163197104Sjkim    "IA-32 Machine Check Exception",
164197104Sjkim    "IA-32 Corrected Machine Check",
165197104Sjkim    "IA-32 Non-Maskable Interrupt",
166197104Sjkim    "Unknown SubTable Type",        /* 3 - Reserved */
167197104Sjkim    "Unknown SubTable Type",        /* 4 - Reserved */
168197104Sjkim    "Unknown SubTable Type",        /* 5 - Reserved */
169193529Sjkim    "PCI Express Root Port AER",
170193529Sjkim    "PCI Express AER (AER Endpoint)",
171193529Sjkim    "PCI Express/PCI-X Bridge AER",
172193529Sjkim    "Generic Hardware Error Source",
173193529Sjkim    "Unknown SubTable Type"         /* Reserved */
174193529Sjkim};
175193529Sjkim
176193529Sjkimstatic const char           *AcpiDmHestNotifySubnames[] =
177193529Sjkim{
178193529Sjkim    "Polled",
179193529Sjkim    "External Interrupt",
180193529Sjkim    "Local Interrupt",
181193529Sjkim    "SCI",
182193529Sjkim    "NMI",
183193529Sjkim    "Unknown Notify Type"           /* Reserved */
184193529Sjkim};
185193529Sjkim
186167802Sjkimstatic const char           *AcpiDmMadtSubnames[] =
187167802Sjkim{
188167802Sjkim    "Processor Local APIC",         /* ACPI_MADT_TYPE_LOCAL_APIC */
189167802Sjkim    "I/O APIC",                     /* ACPI_MADT_TYPE_IO_APIC */
190167802Sjkim    "Interrupt Source Override",    /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */
191167802Sjkim    "NMI Source",                   /* ACPI_MADT_TYPE_NMI_SOURCE */
192167802Sjkim    "Local APIC NMI",               /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */
193167802Sjkim    "Local APIC Address Override",  /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */
194167802Sjkim    "I/O SAPIC",                    /* ACPI_MADT_TYPE_IO_SAPIC */
195167802Sjkim    "Local SAPIC",                  /* ACPI_MADT_TYPE_LOCAL_SAPIC */
196167802Sjkim    "Platform Interrupt Sources",   /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */
197193529Sjkim    "Processor Local x2APIC",       /* ACPI_MADT_TYPE_LOCAL_X2APIC */
198193529Sjkim    "Local x2APIC NMI",             /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */
199228110Sjkim    "Generic Interrupt Controller", /* ACPI_MADT_GENERIC_INTERRUPT */
200228110Sjkim    "Generic Interrupt Distributor",/* ACPI_MADT_GENERIC_DISTRIBUTOR */
201167802Sjkim    "Unknown SubTable Type"         /* Reserved */
202167802Sjkim};
203167802Sjkim
204228110Sjkimstatic const char           *AcpiDmPmttSubnames[] =
205228110Sjkim{
206228110Sjkim    "Socket",                       /* ACPI_PMTT_TYPE_SOCKET */
207228110Sjkim    "Memory Controller",            /* ACPI_PMTT_TYPE_CONTROLLER */
208228110Sjkim    "Physical Component (DIMM)",    /* ACPI_PMTT_TYPE_DIMM  */
209228110Sjkim    "Unknown SubTable Type"         /* Reserved */
210228110Sjkim};
211228110Sjkim
212219707Sjkimstatic const char           *AcpiDmSlicSubnames[] =
213219707Sjkim{
214219707Sjkim    "Public Key Structure",
215219707Sjkim    "Windows Marker Structure",
216219707Sjkim    "Unknown SubTable Type"         /* Reserved */
217219707Sjkim};
218219707Sjkim
219167802Sjkimstatic const char           *AcpiDmSratSubnames[] =
220167802Sjkim{
221167802Sjkim    "Processor Local APIC/SAPIC Affinity",
222167802Sjkim    "Memory Affinity",
223193529Sjkim    "Processor Local x2APIC Affinity",
224167802Sjkim    "Unknown SubTable Type"         /* Reserved */
225167802Sjkim};
226167802Sjkim
227197104Sjkimstatic const char           *AcpiDmIvrsSubnames[] =
228197104Sjkim{
229197104Sjkim    "Hardware Definition Block",
230197104Sjkim    "Memory Definition Block",
231197104Sjkim    "Unknown SubTable Type"         /* Reserved */
232197104Sjkim};
233167802Sjkim
234197104Sjkim
235229989Sjkim#define ACPI_FADT_PM_RESERVED       9
236193529Sjkim
237193529Sjkimstatic const char           *AcpiDmFadtProfiles[] =
238193529Sjkim{
239193529Sjkim    "Unspecified",
240193529Sjkim    "Desktop",
241193529Sjkim    "Mobile",
242193529Sjkim    "Workstation",
243193529Sjkim    "Enterprise Server",
244193529Sjkim    "SOHO Server",
245193529Sjkim    "Appliance PC",
246193529Sjkim    "Performance Server",
247229989Sjkim    "Tablet",
248193529Sjkim    "Unknown Profile Type"
249193529Sjkim};
250193529Sjkim
251216471Sjkim#define ACPI_GAS_WIDTH_RESERVED     5
252216471Sjkim
253216471Sjkimstatic const char           *AcpiDmGasAccessWidth[] =
254216471Sjkim{
255216471Sjkim    "Undefined/Legacy",
256216471Sjkim    "Byte Access:8",
257216471Sjkim    "Word Access:16",
258216471Sjkim    "DWord Access:32",
259216471Sjkim    "QWord Access:64",
260216471Sjkim    "Unknown Width Encoding"
261216471Sjkim};
262216471Sjkim
263216471Sjkim
264167802Sjkim/*******************************************************************************
265167802Sjkim *
266167802Sjkim * ACPI Table Data, indexed by signature.
267167802Sjkim *
268209746Sjkim * Each entry contains: Signature, Table Info, Handler, DtHandler,
269209746Sjkim *  Template, Description
270197104Sjkim *
271209746Sjkim * Simple tables have only a TableInfo structure, complex tables have a
272209746Sjkim * handler. This table must be NULL terminated. RSDP and FACS are
273209746Sjkim * special-cased elsewhere.
274167802Sjkim *
275167802Sjkim ******************************************************************************/
276167802Sjkim
277209746SjkimACPI_DMTABLE_DATA    AcpiDmTableData[] =
278167802Sjkim{
279209746Sjkim    {ACPI_SIG_ASF,  NULL,                   AcpiDmDumpAsf,  DtCompileAsf,   TemplateAsf,    "Alert Standard Format table"},
280209746Sjkim    {ACPI_SIG_BERT, AcpiDmTableInfoBert,    NULL,           NULL,           TemplateBert,   "Boot Error Record Table"},
281228110Sjkim    {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt,    NULL,           NULL,           TemplateBgrt,   "Boot Graphics Resource Table"},
282239340Sjkim    {ACPI_SIG_BOOT, AcpiDmTableInfoBoot,    NULL,           NULL,           TemplateBoot,   "Simple Boot Flag Table"},
283209746Sjkim    {ACPI_SIG_CPEP, NULL,                   AcpiDmDumpCpep, DtCompileCpep,  TemplateCpep,   "Corrected Platform Error Polling table"},
284245582Sjkim    {ACPI_SIG_CSRT, NULL,                   AcpiDmDumpCsrt, DtCompileCsrt,  TemplateCsrt,   "Core System Resource Table"},
285239340Sjkim    {ACPI_SIG_DBG2, NULL,                   AcpiDmDumpDbg2, NULL,           NULL,           "Debug Port table type 2"},
286209746Sjkim    {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp,    NULL,           NULL,           TemplateDbgp,   "Debug Port table"},
287209746Sjkim    {ACPI_SIG_DMAR, NULL,                   AcpiDmDumpDmar, DtCompileDmar,  TemplateDmar,   "DMA Remapping table"},
288209746Sjkim    {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt,    NULL,           NULL,           TemplateEcdt,   "Embedded Controller Boot Resources Table"},
289209746Sjkim    {ACPI_SIG_EINJ, NULL,                   AcpiDmDumpEinj, DtCompileEinj,  TemplateEinj,   "Error Injection table"},
290209746Sjkim    {ACPI_SIG_ERST, NULL,                   AcpiDmDumpErst, DtCompileErst,  TemplateErst,   "Error Record Serialization Table"},
291239340Sjkim    {ACPI_SIG_FADT, NULL,                   AcpiDmDumpFadt, DtCompileFadt,  TemplateFadt,   "Fixed ACPI Description Table (FADT)"},
292228110Sjkim    {ACPI_SIG_FPDT, NULL,                   AcpiDmDumpFpdt, DtCompileFpdt,  TemplateFpdt,   "Firmware Performance Data Table"},
293228110Sjkim    {ACPI_SIG_GTDT, AcpiDmTableInfoGtdt,    NULL,           NULL,           TemplateGtdt,   "Generic Timer Description Table"},
294209746Sjkim    {ACPI_SIG_HEST, NULL,                   AcpiDmDumpHest, DtCompileHest,  TemplateHest,   "Hardware Error Source Table"},
295209746Sjkim    {ACPI_SIG_HPET, AcpiDmTableInfoHpet,    NULL,           NULL,           TemplateHpet,   "High Precision Event Timer table"},
296209746Sjkim    {ACPI_SIG_IVRS, NULL,                   AcpiDmDumpIvrs, DtCompileIvrs,  TemplateIvrs,   "I/O Virtualization Reporting Structure"},
297239340Sjkim    {ACPI_SIG_MADT, NULL,                   AcpiDmDumpMadt, DtCompileMadt,  TemplateMadt,   "Multiple APIC Description Table (MADT)"},
298209746Sjkim    {ACPI_SIG_MCFG, NULL,                   AcpiDmDumpMcfg, DtCompileMcfg,  TemplateMcfg,   "Memory Mapped Configuration table"},
299209746Sjkim    {ACPI_SIG_MCHI, AcpiDmTableInfoMchi,    NULL,           NULL,           TemplateMchi,   "Management Controller Host Interface table"},
300228110Sjkim    {ACPI_SIG_MPST, AcpiDmTableInfoMpst,    AcpiDmDumpMpst, DtCompileMpst,  TemplateMpst,   "Memory Power State Table"},
301209746Sjkim    {ACPI_SIG_MSCT, NULL,                   AcpiDmDumpMsct, DtCompileMsct,  TemplateMsct,   "Maximum System Characteristics Table"},
302246849Sjkim    {ACPI_SIG_MTMR, NULL,                   AcpiDmDumpMtmr, DtCompileMtmr,  TemplateMtmr,   "MID Timer Table"},
303228110Sjkim    {ACPI_SIG_PCCT, NULL,                   AcpiDmDumpPcct, NULL,           NULL,           "Platform Communications Channel Table"},
304228110Sjkim    {ACPI_SIG_PMTT, NULL,                   AcpiDmDumpPmtt, DtCompilePmtt,  TemplatePmtt,   "Platform Memory Topology Table"},
305209746Sjkim    {ACPI_SIG_RSDT, NULL,                   AcpiDmDumpRsdt, DtCompileRsdt,  TemplateRsdt,   "Root System Description Table"},
306228110Sjkim    {ACPI_SIG_S3PT, NULL,                   NULL,           NULL,           TemplateS3pt,   "S3 Performance Table"},
307209746Sjkim    {ACPI_SIG_SBST, AcpiDmTableInfoSbst,    NULL,           NULL,           TemplateSbst,   "Smart Battery Specification Table"},
308219707Sjkim    {ACPI_SIG_SLIC, NULL,                   AcpiDmDumpSlic, DtCompileSlic,  TemplateSlic,   "Software Licensing Description Table"},
309209746Sjkim    {ACPI_SIG_SLIT, NULL,                   AcpiDmDumpSlit, DtCompileSlit,  TemplateSlit,   "System Locality Information Table"},
310209746Sjkim    {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr,    NULL,           NULL,           TemplateSpcr,   "Serial Port Console Redirection table"},
311209746Sjkim    {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi,    NULL,           NULL,           TemplateSpmi,   "Server Platform Management Interface table"},
312209746Sjkim    {ACPI_SIG_SRAT, NULL,                   AcpiDmDumpSrat, DtCompileSrat,  TemplateSrat,   "System Resource Affinity Table"},
313209746Sjkim    {ACPI_SIG_TCPA, AcpiDmTableInfoTcpa,    NULL,           NULL,           TemplateTcpa,   "Trusted Computing Platform Alliance table"},
314245582Sjkim    {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2,    NULL,           NULL,           TemplateTpm2,   "Trusted Platform Module hardware interface table"},
315217365Sjkim    {ACPI_SIG_UEFI, AcpiDmTableInfoUefi,    NULL,           DtCompileUefi,  TemplateUefi,   "UEFI Boot Optimization Table"},
316246849Sjkim    {ACPI_SIG_VRTC, AcpiDmTableInfoVrtc,    AcpiDmDumpVrtc, DtCompileVrtc,  TemplateVrtc,   "Virtual Real-Time Clock Table"},
317209746Sjkim    {ACPI_SIG_WAET, AcpiDmTableInfoWaet,    NULL,           NULL,           TemplateWaet,   "Windows ACPI Emulated Devices Table"},
318209746Sjkim    {ACPI_SIG_WDAT, NULL,                   AcpiDmDumpWdat, DtCompileWdat,  TemplateWdat,   "Watchdog Action Table"},
319209746Sjkim    {ACPI_SIG_WDDT, AcpiDmTableInfoWddt,    NULL,           NULL,           TemplateWddt,   "Watchdog Description Table"},
320209746Sjkim    {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt,    NULL,           NULL,           TemplateWdrt,   "Watchdog Resource Table"},
321209746Sjkim    {ACPI_SIG_XSDT, NULL,                   AcpiDmDumpXsdt, DtCompileXsdt,  TemplateXsdt,   "Extended System Description Table"},
322209746Sjkim    {NULL,          NULL,                   NULL,           NULL,           NULL,           NULL}
323167802Sjkim};
324167802Sjkim
325167802Sjkim
326167802Sjkim/*******************************************************************************
327167802Sjkim *
328209746Sjkim * FUNCTION:    AcpiDmGenerateChecksum
329167802Sjkim *
330209746Sjkim * PARAMETERS:  Table               - Pointer to table to be checksummed
331209746Sjkim *              Length              - Length of the table
332209746Sjkim *              OriginalChecksum    - Value of the checksum field
333167802Sjkim *
334167802Sjkim * RETURN:      8 bit checksum of buffer
335167802Sjkim *
336167802Sjkim * DESCRIPTION: Computes an 8 bit checksum of the table.
337167802Sjkim *
338167802Sjkim ******************************************************************************/
339167802Sjkim
340167802SjkimUINT8
341209746SjkimAcpiDmGenerateChecksum (
342209746Sjkim    void                    *Table,
343209746Sjkim    UINT32                  Length,
344209746Sjkim    UINT8                   OriginalChecksum)
345167802Sjkim{
346167802Sjkim    UINT8                   Checksum;
347167802Sjkim
348167802Sjkim
349167802Sjkim    /* Sum the entire table as-is */
350167802Sjkim
351209746Sjkim    Checksum = AcpiTbChecksum ((UINT8 *) Table, Length);
352167802Sjkim
353167802Sjkim    /* Subtract off the existing checksum value in the table */
354167802Sjkim
355209746Sjkim    Checksum = (UINT8) (Checksum - OriginalChecksum);
356167802Sjkim
357167802Sjkim    /* Compute the final checksum */
358167802Sjkim
359167802Sjkim    Checksum = (UINT8) (0 - Checksum);
360167802Sjkim    return (Checksum);
361167802Sjkim}
362167802Sjkim
363167802Sjkim
364167802Sjkim/*******************************************************************************
365167802Sjkim *
366167802Sjkim * FUNCTION:    AcpiDmGetTableData
367167802Sjkim *
368167802Sjkim * PARAMETERS:  Signature           - ACPI signature (4 chars) to match
369167802Sjkim *
370167802Sjkim * RETURN:      Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found.
371167802Sjkim *
372167802Sjkim * DESCRIPTION: Find a match in the global table of supported ACPI tables
373167802Sjkim *
374167802Sjkim ******************************************************************************/
375167802Sjkim
376209746SjkimACPI_DMTABLE_DATA *
377167802SjkimAcpiDmGetTableData (
378167802Sjkim    char                    *Signature)
379167802Sjkim{
380167802Sjkim    ACPI_DMTABLE_DATA       *TableData;
381167802Sjkim
382167802Sjkim
383167802Sjkim    for (TableData = AcpiDmTableData; TableData->Signature; TableData++)
384167802Sjkim    {
385167802Sjkim        if (ACPI_COMPARE_NAME (Signature, TableData->Signature))
386167802Sjkim        {
387167802Sjkim            return (TableData);
388167802Sjkim        }
389167802Sjkim    }
390167802Sjkim
391167802Sjkim    return (NULL);
392167802Sjkim}
393167802Sjkim
394167802Sjkim
395167802Sjkim/*******************************************************************************
396167802Sjkim *
397167802Sjkim * FUNCTION:    AcpiDmDumpDataTable
398167802Sjkim *
399167802Sjkim * PARAMETERS:  Table               - An ACPI table
400167802Sjkim *
401167802Sjkim * RETURN:      None.
402167802Sjkim *
403167802Sjkim * DESCRIPTION: Format the contents of an ACPI data table (any table other
404167802Sjkim *              than an SSDT or DSDT that does not contain executable AML code)
405167802Sjkim *
406167802Sjkim ******************************************************************************/
407167802Sjkim
408167802Sjkimvoid
409167802SjkimAcpiDmDumpDataTable (
410167802Sjkim    ACPI_TABLE_HEADER       *Table)
411167802Sjkim{
412193529Sjkim    ACPI_STATUS             Status;
413167802Sjkim    ACPI_DMTABLE_DATA       *TableData;
414167802Sjkim    UINT32                  Length;
415167802Sjkim
416167802Sjkim
417167802Sjkim    /* Ignore tables that contain AML */
418167802Sjkim
419167802Sjkim    if (AcpiUtIsAmlTable (Table))
420167802Sjkim    {
421241973Sjkim        if (Gbl_VerboseTemplates)
422241973Sjkim        {
423241973Sjkim            /* Dump the raw table data */
424241973Sjkim
425241973Sjkim            Length = Table->Length;
426241973Sjkim
427241973Sjkim            AcpiOsPrintf ("\n/*\n%s: Length %d (0x%X)\n\n",
428241973Sjkim                ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
429241973Sjkim            AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
430241973Sjkim                Length, DB_BYTE_DISPLAY, 0);
431241973Sjkim            AcpiOsPrintf (" */\n");
432241973Sjkim        }
433167802Sjkim        return;
434167802Sjkim    }
435167802Sjkim
436167802Sjkim    /*
437167802Sjkim     * Handle tables that don't use the common ACPI table header structure.
438228110Sjkim     * Currently, these are the FACS, RSDP, and S3PT.
439167802Sjkim     */
440167802Sjkim    if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS))
441167802Sjkim    {
442167802Sjkim        Length = Table->Length;
443167802Sjkim        AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs);
444167802Sjkim    }
445167802Sjkim    else if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_RSDP))
446167802Sjkim    {
447167802Sjkim        Length = AcpiDmDumpRsdp (Table);
448167802Sjkim    }
449228110Sjkim    else if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_S3PT))
450228110Sjkim    {
451228110Sjkim        Length = AcpiDmDumpS3pt (Table);
452228110Sjkim    }
453167802Sjkim    else
454167802Sjkim    {
455167802Sjkim        /*
456167802Sjkim         * All other tables must use the common ACPI table header, dump it now
457167802Sjkim         */
458167802Sjkim        Length = Table->Length;
459193529Sjkim        Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader);
460193529Sjkim        if (ACPI_FAILURE (Status))
461193529Sjkim        {
462193529Sjkim            return;
463193529Sjkim        }
464167802Sjkim        AcpiOsPrintf ("\n");
465167802Sjkim
466167802Sjkim        /* Match signature and dispatch appropriately */
467167802Sjkim
468167802Sjkim        TableData = AcpiDmGetTableData (Table->Signature);
469167802Sjkim        if (!TableData)
470167802Sjkim        {
471167802Sjkim            if (!ACPI_STRNCMP (Table->Signature, "OEM", 3))
472167802Sjkim            {
473167802Sjkim                AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n",
474167802Sjkim                    Table->Signature);
475167802Sjkim            }
476167802Sjkim            else
477167802Sjkim            {
478167802Sjkim                AcpiOsPrintf ("\n**** Unknown ACPI table type [%4.4s]\n\n",
479167802Sjkim                    Table->Signature);
480246849Sjkim                fprintf (stderr, "Unknown ACPI table signature [%4.4s], decoding header only\n",
481246849Sjkim                    Table->Signature);
482167802Sjkim            }
483167802Sjkim        }
484167802Sjkim        else if (TableData->TableHandler)
485167802Sjkim        {
486167802Sjkim            /* Complex table, has a handler */
487167802Sjkim
488167802Sjkim            TableData->TableHandler (Table);
489167802Sjkim        }
490167802Sjkim        else if (TableData->TableInfo)
491167802Sjkim        {
492167802Sjkim            /* Simple table, just walk the info table */
493167802Sjkim
494167802Sjkim            AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo);
495167802Sjkim        }
496167802Sjkim    }
497167802Sjkim
498209746Sjkim    if (!Gbl_DoTemplates || Gbl_VerboseTemplates)
499209746Sjkim    {
500209746Sjkim        /* Dump the raw table data */
501167802Sjkim
502217365Sjkim        AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n",
503217365Sjkim            ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
504241973Sjkim        AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
505241973Sjkim            Length, DB_BYTE_DISPLAY, 0);
506209746Sjkim    }
507167802Sjkim}
508167802Sjkim
509167802Sjkim
510167802Sjkim/*******************************************************************************
511167802Sjkim *
512167802Sjkim * FUNCTION:    AcpiDmLineHeader
513167802Sjkim *
514167802Sjkim * PARAMETERS:  Offset              - Current byte offset, from table start
515167802Sjkim *              ByteLength          - Length of the field in bytes, 0 for flags
516167802Sjkim *              Name                - Name of this field
517167802Sjkim *              Value               - Optional value, displayed on left of ':'
518167802Sjkim *
519167802Sjkim * RETURN:      None
520167802Sjkim *
521167802Sjkim * DESCRIPTION: Utility routines for formatting output lines. Displays the
522167802Sjkim *              current table offset in hex and decimal, the field length,
523167802Sjkim *              and the field name.
524167802Sjkim *
525167802Sjkim ******************************************************************************/
526167802Sjkim
527167802Sjkimvoid
528167802SjkimAcpiDmLineHeader (
529167802Sjkim    UINT32                  Offset,
530167802Sjkim    UINT32                  ByteLength,
531167802Sjkim    char                    *Name)
532167802Sjkim{
533167802Sjkim
534219707Sjkim    /* Allow a null name for fields that span multiple lines (large buffers) */
535219707Sjkim
536219707Sjkim    if (!Name)
537219707Sjkim    {
538219707Sjkim        Name = "";
539219707Sjkim    }
540219707Sjkim
541209746Sjkim    if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */
542167802Sjkim    {
543209746Sjkim        if (ByteLength)
544209746Sjkim        {
545219707Sjkim            AcpiOsPrintf ("[%.4d] %34s : ", ByteLength, Name);
546209746Sjkim        }
547209746Sjkim        else
548209746Sjkim        {
549220663Sjkim            if (*Name)
550220663Sjkim            {
551220663Sjkim                AcpiOsPrintf ("%41s : ", Name);
552220663Sjkim            }
553220663Sjkim            else
554220663Sjkim            {
555220663Sjkim                AcpiOsPrintf ("%41s   ", Name);
556220663Sjkim            }
557209746Sjkim        }
558167802Sjkim    }
559209746Sjkim    else /* Normal disassembler or verbose template */
560167802Sjkim    {
561209746Sjkim        if (ByteLength)
562209746Sjkim        {
563219707Sjkim            AcpiOsPrintf ("[%3.3Xh %4.4d% 4d] %28s : ",
564209746Sjkim                Offset, Offset, ByteLength, Name);
565209746Sjkim        }
566209746Sjkim        else
567209746Sjkim        {
568220663Sjkim            if (*Name)
569220663Sjkim            {
570220663Sjkim                AcpiOsPrintf ("%44s : ", Name);
571220663Sjkim            }
572220663Sjkim            else
573220663Sjkim            {
574220663Sjkim                AcpiOsPrintf ("%44s   ", Name);
575220663Sjkim            }
576209746Sjkim        }
577167802Sjkim    }
578167802Sjkim}
579167802Sjkim
580167802Sjkimvoid
581167802SjkimAcpiDmLineHeader2 (
582167802Sjkim    UINT32                  Offset,
583167802Sjkim    UINT32                  ByteLength,
584167802Sjkim    char                    *Name,
585167802Sjkim    UINT32                  Value)
586167802Sjkim{
587167802Sjkim
588209746Sjkim    if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */
589167802Sjkim    {
590209746Sjkim        if (ByteLength)
591209746Sjkim        {
592220663Sjkim            AcpiOsPrintf ("[%.4d] %30s %3d : ",
593209746Sjkim                ByteLength, Name, Value);
594209746Sjkim        }
595209746Sjkim        else
596209746Sjkim        {
597209746Sjkim            AcpiOsPrintf ("%36s % 3d : ",
598209746Sjkim                Name, Value);
599209746Sjkim        }
600167802Sjkim    }
601209746Sjkim    else /* Normal disassembler or verbose template */
602167802Sjkim    {
603209746Sjkim        if (ByteLength)
604209746Sjkim        {
605220663Sjkim            AcpiOsPrintf ("[%3.3Xh %4.4d %3d] %24s %3d : ",
606209746Sjkim                Offset, Offset, ByteLength, Name, Value);
607209746Sjkim        }
608209746Sjkim        else
609209746Sjkim        {
610220663Sjkim            AcpiOsPrintf ("[%3.3Xh %4.4d   ] %24s %3d : ",
611209746Sjkim                Offset, Offset, Name, Value);
612209746Sjkim        }
613167802Sjkim    }
614167802Sjkim}
615167802Sjkim
616167802Sjkim
617167802Sjkim/*******************************************************************************
618167802Sjkim *
619167802Sjkim * FUNCTION:    AcpiDmDumpTable
620167802Sjkim *
621167802Sjkim * PARAMETERS:  TableLength         - Length of the entire ACPI table
622167802Sjkim *              TableOffset         - Starting offset within the table for this
623167802Sjkim *                                    sub-descriptor (0 if main table)
624167802Sjkim *              Table               - The ACPI table
625193529Sjkim *              SubtableLength      - Length of this sub-descriptor
626167802Sjkim *              Info                - Info table for this ACPI table
627167802Sjkim *
628167802Sjkim * RETURN:      None
629167802Sjkim *
630167802Sjkim * DESCRIPTION: Display ACPI table contents by walking the Info table.
631167802Sjkim *
632209746Sjkim * Note: This function must remain in sync with DtGetFieldLength.
633209746Sjkim *
634167802Sjkim ******************************************************************************/
635167802Sjkim
636193529SjkimACPI_STATUS
637167802SjkimAcpiDmDumpTable (
638167802Sjkim    UINT32                  TableLength,
639167802Sjkim    UINT32                  TableOffset,
640167802Sjkim    void                    *Table,
641167802Sjkim    UINT32                  SubtableLength,
642167802Sjkim    ACPI_DMTABLE_INFO       *Info)
643167802Sjkim{
644167802Sjkim    UINT8                   *Target;
645167802Sjkim    UINT32                  CurrentOffset;
646167802Sjkim    UINT32                  ByteLength;
647167802Sjkim    UINT8                   Temp8;
648167802Sjkim    UINT16                  Temp16;
649167802Sjkim    ACPI_DMTABLE_DATA       *TableData;
650197104Sjkim    const char              *Name;
651193529Sjkim    BOOLEAN                 LastOutputBlankLine = FALSE;
652197104Sjkim    char                    RepairedName[8];
653167802Sjkim
654167802Sjkim
655167802Sjkim    if (!Info)
656167802Sjkim    {
657167802Sjkim        AcpiOsPrintf ("Display not implemented\n");
658193529Sjkim        return (AE_NOT_IMPLEMENTED);
659167802Sjkim    }
660167802Sjkim
661167802Sjkim    /* Walk entire Info table; Null name terminates */
662167802Sjkim
663167802Sjkim    for (; Info->Name; Info++)
664167802Sjkim    {
665167802Sjkim        /*
666167802Sjkim         * Target points to the field within the ACPI Table. CurrentOffset is
667167802Sjkim         * the offset of the field from the start of the main table.
668167802Sjkim         */
669167802Sjkim        Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset);
670167802Sjkim        CurrentOffset = TableOffset + Info->Offset;
671167802Sjkim
672167802Sjkim        /* Check for beyond EOT or beyond subtable end */
673167802Sjkim
674167802Sjkim        if ((CurrentOffset >= TableLength) ||
675167802Sjkim            (SubtableLength && (Info->Offset >= SubtableLength)))
676167802Sjkim        {
677193529Sjkim            AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
678193529Sjkim            return (AE_BAD_DATA);
679167802Sjkim        }
680167802Sjkim
681167802Sjkim        /* Generate the byte length for this field */
682167802Sjkim
683167802Sjkim        switch (Info->Opcode)
684167802Sjkim        {
685167802Sjkim        case ACPI_DMT_UINT8:
686167802Sjkim        case ACPI_DMT_CHKSUM:
687167802Sjkim        case ACPI_DMT_SPACEID:
688216471Sjkim        case ACPI_DMT_ACCWIDTH:
689197104Sjkim        case ACPI_DMT_IVRS:
690167802Sjkim        case ACPI_DMT_MADT:
691228110Sjkim        case ACPI_DMT_PMTT:
692167802Sjkim        case ACPI_DMT_SRAT:
693193529Sjkim        case ACPI_DMT_ASF:
694193529Sjkim        case ACPI_DMT_HESTNTYP:
695193529Sjkim        case ACPI_DMT_FADTPM:
696209746Sjkim        case ACPI_DMT_EINJACT:
697209746Sjkim        case ACPI_DMT_EINJINST:
698209746Sjkim        case ACPI_DMT_ERSTACT:
699209746Sjkim        case ACPI_DMT_ERSTINST:
700167802Sjkim            ByteLength = 1;
701167802Sjkim            break;
702167802Sjkim        case ACPI_DMT_UINT16:
703167802Sjkim        case ACPI_DMT_DMAR:
704193529Sjkim        case ACPI_DMT_HEST:
705167802Sjkim            ByteLength = 2;
706167802Sjkim            break;
707167802Sjkim        case ACPI_DMT_UINT24:
708167802Sjkim            ByteLength = 3;
709167802Sjkim            break;
710167802Sjkim        case ACPI_DMT_UINT32:
711167802Sjkim        case ACPI_DMT_NAME4:
712167802Sjkim        case ACPI_DMT_SIG:
713219707Sjkim        case ACPI_DMT_SLIC:
714167802Sjkim            ByteLength = 4;
715167802Sjkim            break;
716228110Sjkim        case ACPI_DMT_UINT40:
717228110Sjkim            ByteLength = 5;
718228110Sjkim            break;
719228110Sjkim        case ACPI_DMT_UINT48:
720167802Sjkim        case ACPI_DMT_NAME6:
721167802Sjkim            ByteLength = 6;
722167802Sjkim            break;
723167802Sjkim        case ACPI_DMT_UINT56:
724218590Sjkim        case ACPI_DMT_BUF7:
725167802Sjkim            ByteLength = 7;
726167802Sjkim            break;
727167802Sjkim        case ACPI_DMT_UINT64:
728167802Sjkim        case ACPI_DMT_NAME8:
729167802Sjkim            ByteLength = 8;
730167802Sjkim            break;
731197104Sjkim        case ACPI_DMT_BUF16:
732217365Sjkim        case ACPI_DMT_UUID:
733197104Sjkim            ByteLength = 16;
734197104Sjkim            break;
735219707Sjkim        case ACPI_DMT_BUF128:
736219707Sjkim            ByteLength = 128;
737219707Sjkim            break;
738167802Sjkim        case ACPI_DMT_STRING:
739167802Sjkim            ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1;
740167802Sjkim            break;
741167802Sjkim        case ACPI_DMT_GAS:
742193529Sjkim            if (!LastOutputBlankLine)
743193529Sjkim            {
744193529Sjkim                AcpiOsPrintf ("\n");
745193529Sjkim                LastOutputBlankLine = TRUE;
746193529Sjkim            }
747167802Sjkim            ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
748167802Sjkim            break;
749193529Sjkim        case ACPI_DMT_HESTNTFY:
750193529Sjkim            if (!LastOutputBlankLine)
751193529Sjkim            {
752193529Sjkim                AcpiOsPrintf ("\n");
753193529Sjkim                LastOutputBlankLine = TRUE;
754193529Sjkim            }
755193529Sjkim            ByteLength = sizeof (ACPI_HEST_NOTIFY);
756193529Sjkim            break;
757167802Sjkim        default:
758167802Sjkim            ByteLength = 0;
759167802Sjkim            break;
760167802Sjkim        }
761167802Sjkim
762193529Sjkim        if (CurrentOffset + ByteLength > TableLength)
763193529Sjkim        {
764193529Sjkim            AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
765193529Sjkim            return (AE_BAD_DATA);
766193529Sjkim        }
767193529Sjkim
768228110Sjkim        if (Info->Opcode == ACPI_DMT_EXTRA_TEXT)
769228110Sjkim        {
770228110Sjkim            AcpiOsPrintf ("%s", Info->Name);
771228110Sjkim            continue;
772228110Sjkim        }
773228110Sjkim
774167802Sjkim        /* Start a new line and decode the opcode */
775167802Sjkim
776167802Sjkim        AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name);
777167802Sjkim
778167802Sjkim        switch (Info->Opcode)
779167802Sjkim        {
780167802Sjkim        /* Single-bit Flag fields. Note: Opcode is the bit position */
781167802Sjkim
782167802Sjkim        case ACPI_DMT_FLAG0:
783167802Sjkim        case ACPI_DMT_FLAG1:
784167802Sjkim        case ACPI_DMT_FLAG2:
785167802Sjkim        case ACPI_DMT_FLAG3:
786167802Sjkim        case ACPI_DMT_FLAG4:
787167802Sjkim        case ACPI_DMT_FLAG5:
788167802Sjkim        case ACPI_DMT_FLAG6:
789167802Sjkim        case ACPI_DMT_FLAG7:
790167802Sjkim
791167802Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01);
792167802Sjkim            break;
793167802Sjkim
794167802Sjkim        /* 2-bit Flag fields */
795167802Sjkim
796167802Sjkim        case ACPI_DMT_FLAGS0:
797167802Sjkim
798167802Sjkim            AcpiOsPrintf ("%1.1X\n", *Target & 0x03);
799167802Sjkim            break;
800167802Sjkim
801228110Sjkim        case ACPI_DMT_FLAGS1:
802228110Sjkim
803228110Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> 1) & 0x03);
804228110Sjkim            break;
805228110Sjkim
806167802Sjkim        case ACPI_DMT_FLAGS2:
807167802Sjkim
808167802Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03);
809167802Sjkim            break;
810167802Sjkim
811228110Sjkim        case ACPI_DMT_FLAGS4:
812167802Sjkim
813228110Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03);
814167802Sjkim            break;
815167802Sjkim
816228110Sjkim        /* Integer Data Types */
817228110Sjkim
818228110Sjkim        case ACPI_DMT_UINT8:
819167802Sjkim        case ACPI_DMT_UINT16:
820167802Sjkim        case ACPI_DMT_UINT24:
821167802Sjkim        case ACPI_DMT_UINT32:
822228110Sjkim        case ACPI_DMT_UINT40:
823228110Sjkim        case ACPI_DMT_UINT48:
824167802Sjkim        case ACPI_DMT_UINT56:
825228110Sjkim        case ACPI_DMT_UINT64:
826228110Sjkim            /*
827228110Sjkim             * Dump bytes - high byte first, low byte last.
828228110Sjkim             * Note: All ACPI tables are little-endian.
829228110Sjkim             */
830228110Sjkim            for (Temp8 = (UINT8) ByteLength; Temp8 > 0; Temp8--)
831193529Sjkim            {
832228110Sjkim                AcpiOsPrintf ("%2.2X", Target[Temp8 - 1]);
833193529Sjkim            }
834193529Sjkim            AcpiOsPrintf ("\n");
835167802Sjkim            break;
836167802Sjkim
837218590Sjkim        case ACPI_DMT_BUF7:
838197104Sjkim        case ACPI_DMT_BUF16:
839219707Sjkim        case ACPI_DMT_BUF128:
840197104Sjkim
841218590Sjkim            /*
842218590Sjkim             * Buffer: Size depends on the opcode and was set above.
843218590Sjkim             * Each hex byte is separated with a space.
844220663Sjkim             * Multiple lines are separated by line continuation char.
845218590Sjkim             */
846219707Sjkim            for (Temp16 = 0; Temp16 < ByteLength; Temp16++)
847197104Sjkim            {
848219707Sjkim                AcpiOsPrintf ("%2.2X", Target[Temp16]);
849219707Sjkim                if ((UINT32) (Temp16 + 1) < ByteLength)
850209746Sjkim                {
851219707Sjkim                    if ((Temp16 > 0) && (!((Temp16+1) % 16)))
852219707Sjkim                    {
853220663Sjkim                        AcpiOsPrintf (" \\\n"); /* Line continuation */
854219707Sjkim                        AcpiDmLineHeader (0, 0, NULL);
855219707Sjkim                    }
856219707Sjkim                    else
857219707Sjkim                    {
858219707Sjkim                        AcpiOsPrintf (" ");
859219707Sjkim                    }
860209746Sjkim                }
861197104Sjkim            }
862197104Sjkim            AcpiOsPrintf ("\n");
863197104Sjkim            break;
864197104Sjkim
865217365Sjkim        case ACPI_DMT_UUID:
866217365Sjkim
867217365Sjkim            /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */
868217365Sjkim
869217365Sjkim            (void) AuConvertUuidToString ((char *) Target, MsgBuffer);
870217365Sjkim
871217365Sjkim            AcpiOsPrintf ("%s\n", MsgBuffer);
872217365Sjkim            break;
873217365Sjkim
874167802Sjkim        case ACPI_DMT_STRING:
875167802Sjkim
876197104Sjkim            AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target));
877167802Sjkim            break;
878167802Sjkim
879167802Sjkim        /* Fixed length ASCII name fields */
880167802Sjkim
881167802Sjkim        case ACPI_DMT_SIG:
882167802Sjkim
883197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 4);
884197104Sjkim            AcpiOsPrintf ("\"%.4s\"    ", RepairedName);
885167802Sjkim            TableData = AcpiDmGetTableData (ACPI_CAST_PTR (char, Target));
886167802Sjkim            if (TableData)
887167802Sjkim            {
888220663Sjkim                AcpiOsPrintf (STRING_FORMAT, TableData->Name);
889167802Sjkim            }
890220663Sjkim            else
891220663Sjkim            {
892220663Sjkim                AcpiOsPrintf ("\n");
893220663Sjkim            }
894167802Sjkim            break;
895167802Sjkim
896167802Sjkim        case ACPI_DMT_NAME4:
897167802Sjkim
898197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 4);
899197104Sjkim            AcpiOsPrintf ("\"%.4s\"\n", RepairedName);
900167802Sjkim            break;
901167802Sjkim
902167802Sjkim        case ACPI_DMT_NAME6:
903167802Sjkim
904197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 6);
905197104Sjkim            AcpiOsPrintf ("\"%.6s\"\n", RepairedName);
906167802Sjkim            break;
907167802Sjkim
908167802Sjkim        case ACPI_DMT_NAME8:
909167802Sjkim
910197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 8);
911197104Sjkim            AcpiOsPrintf ("\"%.8s\"\n", RepairedName);
912167802Sjkim            break;
913167802Sjkim
914167802Sjkim        /* Special Data Types */
915167802Sjkim
916167802Sjkim        case ACPI_DMT_CHKSUM:
917167802Sjkim
918167802Sjkim            /* Checksum, display and validate */
919167802Sjkim
920167802Sjkim            AcpiOsPrintf ("%2.2X", *Target);
921209746Sjkim            Temp8 = AcpiDmGenerateChecksum (Table,
922209746Sjkim                        ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
923209746Sjkim                        ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum);
924167802Sjkim            if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
925167802Sjkim            {
926167802Sjkim                AcpiOsPrintf (
927167802Sjkim                    "     /* Incorrect checksum, should be %2.2X */", Temp8);
928167802Sjkim            }
929167802Sjkim            AcpiOsPrintf ("\n");
930167802Sjkim            break;
931167802Sjkim
932167802Sjkim        case ACPI_DMT_SPACEID:
933167802Sjkim
934167802Sjkim            /* Address Space ID */
935167802Sjkim
936220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target));
937167802Sjkim            break;
938167802Sjkim
939216471Sjkim        case ACPI_DMT_ACCWIDTH:
940216471Sjkim
941216471Sjkim            /* Encoded Access Width */
942216471Sjkim
943216471Sjkim            Temp8 = *Target;
944216471Sjkim            if (Temp8 > ACPI_GAS_WIDTH_RESERVED)
945216471Sjkim            {
946216471Sjkim                Temp8 = ACPI_GAS_WIDTH_RESERVED;
947216471Sjkim            }
948216471Sjkim
949220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, Temp8, AcpiDmGasAccessWidth[Temp8]);
950216471Sjkim            break;
951216471Sjkim
952167802Sjkim        case ACPI_DMT_GAS:
953167802Sjkim
954167802Sjkim            /* Generic Address Structure */
955167802Sjkim
956220663Sjkim            AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure");
957197104Sjkim            AcpiDmDumpTable (TableLength, CurrentOffset, Target,
958197104Sjkim                sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas);
959193529Sjkim            AcpiOsPrintf ("\n");
960193529Sjkim            LastOutputBlankLine = TRUE;
961167802Sjkim            break;
962167802Sjkim
963193529Sjkim        case ACPI_DMT_ASF:
964193529Sjkim
965193529Sjkim            /* ASF subtable types */
966193529Sjkim
967193529Sjkim            Temp16 = (UINT16) ((*Target) & 0x7F);  /* Top bit can be zero or one */
968193529Sjkim            if (Temp16 > ACPI_ASF_TYPE_RESERVED)
969193529Sjkim            {
970193529Sjkim                Temp16 = ACPI_ASF_TYPE_RESERVED;
971193529Sjkim            }
972193529Sjkim
973220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]);
974193529Sjkim            break;
975193529Sjkim
976167802Sjkim        case ACPI_DMT_DMAR:
977167802Sjkim
978167802Sjkim            /* DMAR subtable types */
979167802Sjkim
980193529Sjkim            Temp16 = ACPI_GET16 (Target);
981167802Sjkim            if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
982167802Sjkim            {
983167802Sjkim                Temp16 = ACPI_DMAR_TYPE_RESERVED;
984167802Sjkim            }
985167802Sjkim
986220663Sjkim            AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmDmarSubnames[Temp16]);
987167802Sjkim            break;
988167802Sjkim
989209746Sjkim        case ACPI_DMT_EINJACT:
990209746Sjkim
991209746Sjkim            /* EINJ Action types */
992209746Sjkim
993209746Sjkim            Temp8 = *Target;
994209746Sjkim            if (Temp8 > ACPI_EINJ_ACTION_RESERVED)
995209746Sjkim            {
996209746Sjkim                Temp8 = ACPI_EINJ_ACTION_RESERVED;
997209746Sjkim            }
998209746Sjkim
999220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmEinjActions[Temp8]);
1000209746Sjkim            break;
1001209746Sjkim
1002209746Sjkim        case ACPI_DMT_EINJINST:
1003209746Sjkim
1004209746Sjkim            /* EINJ Instruction types */
1005209746Sjkim
1006209746Sjkim            Temp8 = *Target;
1007209746Sjkim            if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED)
1008209746Sjkim            {
1009209746Sjkim                Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED;
1010209746Sjkim            }
1011209746Sjkim
1012220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmEinjInstructions[Temp8]);
1013209746Sjkim            break;
1014209746Sjkim
1015209746Sjkim        case ACPI_DMT_ERSTACT:
1016209746Sjkim
1017209746Sjkim            /* ERST Action types */
1018209746Sjkim
1019209746Sjkim            Temp8 = *Target;
1020209746Sjkim            if (Temp8 > ACPI_ERST_ACTION_RESERVED)
1021209746Sjkim            {
1022209746Sjkim                Temp8 = ACPI_ERST_ACTION_RESERVED;
1023209746Sjkim            }
1024209746Sjkim
1025220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmErstActions[Temp8]);
1026209746Sjkim            break;
1027209746Sjkim
1028209746Sjkim        case ACPI_DMT_ERSTINST:
1029209746Sjkim
1030209746Sjkim            /* ERST Instruction types */
1031209746Sjkim
1032209746Sjkim            Temp8 = *Target;
1033209746Sjkim            if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED)
1034209746Sjkim            {
1035209746Sjkim                Temp8 = ACPI_ERST_INSTRUCTION_RESERVED;
1036209746Sjkim            }
1037209746Sjkim
1038220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmErstInstructions[Temp8]);
1039209746Sjkim            break;
1040209746Sjkim
1041193529Sjkim        case ACPI_DMT_HEST:
1042193529Sjkim
1043193529Sjkim            /* HEST subtable types */
1044193529Sjkim
1045193529Sjkim            Temp16 = ACPI_GET16 (Target);
1046193529Sjkim            if (Temp16 > ACPI_HEST_TYPE_RESERVED)
1047193529Sjkim            {
1048193529Sjkim                Temp16 = ACPI_HEST_TYPE_RESERVED;
1049193529Sjkim            }
1050193529Sjkim
1051220663Sjkim            AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmHestSubnames[Temp16]);
1052193529Sjkim            break;
1053193529Sjkim
1054193529Sjkim        case ACPI_DMT_HESTNTFY:
1055193529Sjkim
1056220663Sjkim            AcpiOsPrintf (STRING_FORMAT, "Hardware Error Notification Structure");
1057197104Sjkim            AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1058197104Sjkim                sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify);
1059193529Sjkim            AcpiOsPrintf ("\n");
1060193529Sjkim            LastOutputBlankLine = TRUE;
1061193529Sjkim            break;
1062193529Sjkim
1063193529Sjkim        case ACPI_DMT_HESTNTYP:
1064193529Sjkim
1065193529Sjkim            /* HEST Notify types */
1066193529Sjkim
1067193529Sjkim            Temp8 = *Target;
1068193529Sjkim            if (Temp8 > ACPI_HEST_NOTIFY_RESERVED)
1069193529Sjkim            {
1070193529Sjkim                Temp8 = ACPI_HEST_NOTIFY_RESERVED;
1071193529Sjkim            }
1072193529Sjkim
1073220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmHestNotifySubnames[Temp8]);
1074193529Sjkim            break;
1075193529Sjkim
1076167802Sjkim        case ACPI_DMT_MADT:
1077167802Sjkim
1078167802Sjkim            /* MADT subtable types */
1079167802Sjkim
1080167802Sjkim            Temp8 = *Target;
1081167802Sjkim            if (Temp8 > ACPI_MADT_TYPE_RESERVED)
1082167802Sjkim            {
1083167802Sjkim                Temp8 = ACPI_MADT_TYPE_RESERVED;
1084167802Sjkim            }
1085167802Sjkim
1086220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmMadtSubnames[Temp8]);
1087167802Sjkim            break;
1088167802Sjkim
1089228110Sjkim        case ACPI_DMT_PMTT:
1090228110Sjkim
1091228110Sjkim            /* PMTT subtable types */
1092228110Sjkim
1093228110Sjkim            Temp8 = *Target;
1094228110Sjkim            if (Temp8 > ACPI_PMTT_TYPE_RESERVED)
1095228110Sjkim            {
1096228110Sjkim                Temp8 = ACPI_PMTT_TYPE_RESERVED;
1097228110Sjkim            }
1098228110Sjkim
1099228110Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmPmttSubnames[Temp8]);
1100228110Sjkim            break;
1101228110Sjkim
1102219707Sjkim        case ACPI_DMT_SLIC:
1103219707Sjkim
1104219707Sjkim            /* SLIC subtable types */
1105219707Sjkim
1106219707Sjkim            Temp8 = *Target;
1107219707Sjkim            if (Temp8 > ACPI_SLIC_TYPE_RESERVED)
1108219707Sjkim            {
1109219707Sjkim                Temp8 = ACPI_SLIC_TYPE_RESERVED;
1110219707Sjkim            }
1111219707Sjkim
1112220663Sjkim            AcpiOsPrintf (UINT32_FORMAT, *Target, AcpiDmSlicSubnames[Temp8]);
1113219707Sjkim            break;
1114219707Sjkim
1115167802Sjkim        case ACPI_DMT_SRAT:
1116167802Sjkim
1117167802Sjkim            /* SRAT subtable types */
1118167802Sjkim
1119167802Sjkim            Temp8 = *Target;
1120167802Sjkim            if (Temp8 > ACPI_SRAT_TYPE_RESERVED)
1121167802Sjkim            {
1122167802Sjkim                Temp8 = ACPI_SRAT_TYPE_RESERVED;
1123167802Sjkim            }
1124167802Sjkim
1125220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmSratSubnames[Temp8]);
1126167802Sjkim            break;
1127167802Sjkim
1128193529Sjkim        case ACPI_DMT_FADTPM:
1129193529Sjkim
1130193529Sjkim            /* FADT Preferred PM Profile names */
1131193529Sjkim
1132193529Sjkim            Temp8 = *Target;
1133193529Sjkim            if (Temp8 > ACPI_FADT_PM_RESERVED)
1134193529Sjkim            {
1135193529Sjkim                Temp8 = ACPI_FADT_PM_RESERVED;
1136193529Sjkim            }
1137193529Sjkim
1138220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmFadtProfiles[Temp8]);
1139193529Sjkim            break;
1140193529Sjkim
1141197104Sjkim        case ACPI_DMT_IVRS:
1142197104Sjkim
1143197104Sjkim            /* IVRS subtable types */
1144197104Sjkim
1145197104Sjkim            Temp8 = *Target;
1146197104Sjkim            switch (Temp8)
1147197104Sjkim            {
1148197104Sjkim            case ACPI_IVRS_TYPE_HARDWARE:
1149197104Sjkim                Name = AcpiDmIvrsSubnames[0];
1150197104Sjkim                break;
1151197104Sjkim
1152197104Sjkim            case ACPI_IVRS_TYPE_MEMORY1:
1153197104Sjkim            case ACPI_IVRS_TYPE_MEMORY2:
1154197104Sjkim            case ACPI_IVRS_TYPE_MEMORY3:
1155197104Sjkim                Name = AcpiDmIvrsSubnames[1];
1156197104Sjkim                break;
1157197104Sjkim
1158197104Sjkim            default:
1159197104Sjkim                Name = AcpiDmIvrsSubnames[2];
1160197104Sjkim                break;
1161197104Sjkim            }
1162197104Sjkim
1163220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, Name);
1164197104Sjkim            break;
1165197104Sjkim
1166167802Sjkim        case ACPI_DMT_EXIT:
1167193529Sjkim            return (AE_OK);
1168167802Sjkim
1169167802Sjkim        default:
1170167802Sjkim            ACPI_ERROR ((AE_INFO,
1171204773Sjkim                "**** Invalid table opcode [0x%X] ****\n", Info->Opcode));
1172193529Sjkim            return (AE_SUPPORT);
1173167802Sjkim        }
1174167802Sjkim    }
1175193529Sjkim
1176193529Sjkim    if (TableOffset && !SubtableLength)
1177193529Sjkim    {
1178193529Sjkim        /* If this table is not the main table, subtable must have valid length */
1179193529Sjkim
1180193529Sjkim        AcpiOsPrintf ("Invalid zero length subtable\n");
1181193529Sjkim        return (AE_BAD_DATA);
1182193529Sjkim    }
1183193529Sjkim
1184193529Sjkim    return (AE_OK);
1185167802Sjkim}
1186167802Sjkim
1187167802Sjkim
1188167802Sjkim/*******************************************************************************
1189167802Sjkim *
1190167802Sjkim * FUNCTION:    AcpiDmCheckAscii
1191167802Sjkim *
1192167802Sjkim * PARAMETERS:  Name                - Ascii string
1193167802Sjkim *              Count               - Number of characters to check
1194167802Sjkim *
1195167802Sjkim * RETURN:      None
1196167802Sjkim *
1197167802Sjkim * DESCRIPTION: Ensure that the requested number of characters are printable
1198167802Sjkim *              Ascii characters. Sets non-printable and null chars to <space>.
1199167802Sjkim *
1200167802Sjkim ******************************************************************************/
1201167802Sjkim
1202167802Sjkimstatic void
1203167802SjkimAcpiDmCheckAscii (
1204167802Sjkim    UINT8                   *Name,
1205197104Sjkim    char                    *RepairedName,
1206167802Sjkim    UINT32                  Count)
1207167802Sjkim{
1208167802Sjkim    UINT32                  i;
1209167802Sjkim
1210167802Sjkim
1211167802Sjkim    for (i = 0; i < Count; i++)
1212167802Sjkim    {
1213198237Sjkim        RepairedName[i] = (char) Name[i];
1214197104Sjkim
1215197104Sjkim        if (!Name[i])
1216167802Sjkim        {
1217197104Sjkim            return;
1218167802Sjkim        }
1219197104Sjkim        if (!isprint (Name[i]))
1220197104Sjkim        {
1221197104Sjkim            RepairedName[i] = ' ';
1222197104Sjkim        }
1223167802Sjkim    }
1224167802Sjkim}
1225