dmtable.c revision 250838
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:
700250838Sjkim
701167802Sjkim            ByteLength = 1;
702167802Sjkim            break;
703250838Sjkim
704167802Sjkim        case ACPI_DMT_UINT16:
705167802Sjkim        case ACPI_DMT_DMAR:
706193529Sjkim        case ACPI_DMT_HEST:
707250838Sjkim
708167802Sjkim            ByteLength = 2;
709167802Sjkim            break;
710250838Sjkim
711167802Sjkim        case ACPI_DMT_UINT24:
712250838Sjkim
713167802Sjkim            ByteLength = 3;
714167802Sjkim            break;
715250838Sjkim
716167802Sjkim        case ACPI_DMT_UINT32:
717167802Sjkim        case ACPI_DMT_NAME4:
718167802Sjkim        case ACPI_DMT_SIG:
719219707Sjkim        case ACPI_DMT_SLIC:
720250838Sjkim
721167802Sjkim            ByteLength = 4;
722167802Sjkim            break;
723250838Sjkim
724228110Sjkim        case ACPI_DMT_UINT40:
725250838Sjkim
726228110Sjkim            ByteLength = 5;
727228110Sjkim            break;
728250838Sjkim
729228110Sjkim        case ACPI_DMT_UINT48:
730167802Sjkim        case ACPI_DMT_NAME6:
731250838Sjkim
732167802Sjkim            ByteLength = 6;
733167802Sjkim            break;
734250838Sjkim
735167802Sjkim        case ACPI_DMT_UINT56:
736218590Sjkim        case ACPI_DMT_BUF7:
737250838Sjkim
738167802Sjkim            ByteLength = 7;
739167802Sjkim            break;
740250838Sjkim
741167802Sjkim        case ACPI_DMT_UINT64:
742167802Sjkim        case ACPI_DMT_NAME8:
743250838Sjkim
744167802Sjkim            ByteLength = 8;
745167802Sjkim            break;
746250838Sjkim
747197104Sjkim        case ACPI_DMT_BUF16:
748217365Sjkim        case ACPI_DMT_UUID:
749250838Sjkim
750197104Sjkim            ByteLength = 16;
751197104Sjkim            break;
752250838Sjkim
753219707Sjkim        case ACPI_DMT_BUF128:
754250838Sjkim
755219707Sjkim            ByteLength = 128;
756219707Sjkim            break;
757250838Sjkim
758167802Sjkim        case ACPI_DMT_STRING:
759250838Sjkim
760167802Sjkim            ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1;
761167802Sjkim            break;
762250838Sjkim
763167802Sjkim        case ACPI_DMT_GAS:
764250838Sjkim
765193529Sjkim            if (!LastOutputBlankLine)
766193529Sjkim            {
767193529Sjkim                AcpiOsPrintf ("\n");
768193529Sjkim                LastOutputBlankLine = TRUE;
769193529Sjkim            }
770167802Sjkim            ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
771167802Sjkim            break;
772250838Sjkim
773193529Sjkim        case ACPI_DMT_HESTNTFY:
774250838Sjkim
775193529Sjkim            if (!LastOutputBlankLine)
776193529Sjkim            {
777193529Sjkim                AcpiOsPrintf ("\n");
778193529Sjkim                LastOutputBlankLine = TRUE;
779193529Sjkim            }
780193529Sjkim            ByteLength = sizeof (ACPI_HEST_NOTIFY);
781193529Sjkim            break;
782250838Sjkim
783167802Sjkim        default:
784250838Sjkim
785167802Sjkim            ByteLength = 0;
786167802Sjkim            break;
787167802Sjkim        }
788167802Sjkim
789193529Sjkim        if (CurrentOffset + ByteLength > TableLength)
790193529Sjkim        {
791193529Sjkim            AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
792193529Sjkim            return (AE_BAD_DATA);
793193529Sjkim        }
794193529Sjkim
795228110Sjkim        if (Info->Opcode == ACPI_DMT_EXTRA_TEXT)
796228110Sjkim        {
797228110Sjkim            AcpiOsPrintf ("%s", Info->Name);
798228110Sjkim            continue;
799228110Sjkim        }
800228110Sjkim
801167802Sjkim        /* Start a new line and decode the opcode */
802167802Sjkim
803167802Sjkim        AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name);
804167802Sjkim
805167802Sjkim        switch (Info->Opcode)
806167802Sjkim        {
807167802Sjkim        /* Single-bit Flag fields. Note: Opcode is the bit position */
808167802Sjkim
809167802Sjkim        case ACPI_DMT_FLAG0:
810167802Sjkim        case ACPI_DMT_FLAG1:
811167802Sjkim        case ACPI_DMT_FLAG2:
812167802Sjkim        case ACPI_DMT_FLAG3:
813167802Sjkim        case ACPI_DMT_FLAG4:
814167802Sjkim        case ACPI_DMT_FLAG5:
815167802Sjkim        case ACPI_DMT_FLAG6:
816167802Sjkim        case ACPI_DMT_FLAG7:
817167802Sjkim
818167802Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01);
819167802Sjkim            break;
820167802Sjkim
821167802Sjkim        /* 2-bit Flag fields */
822167802Sjkim
823167802Sjkim        case ACPI_DMT_FLAGS0:
824167802Sjkim
825167802Sjkim            AcpiOsPrintf ("%1.1X\n", *Target & 0x03);
826167802Sjkim            break;
827167802Sjkim
828228110Sjkim        case ACPI_DMT_FLAGS1:
829228110Sjkim
830228110Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> 1) & 0x03);
831228110Sjkim            break;
832228110Sjkim
833167802Sjkim        case ACPI_DMT_FLAGS2:
834167802Sjkim
835167802Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03);
836167802Sjkim            break;
837167802Sjkim
838228110Sjkim        case ACPI_DMT_FLAGS4:
839167802Sjkim
840228110Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03);
841167802Sjkim            break;
842167802Sjkim
843228110Sjkim        /* Integer Data Types */
844228110Sjkim
845228110Sjkim        case ACPI_DMT_UINT8:
846167802Sjkim        case ACPI_DMT_UINT16:
847167802Sjkim        case ACPI_DMT_UINT24:
848167802Sjkim        case ACPI_DMT_UINT32:
849228110Sjkim        case ACPI_DMT_UINT40:
850228110Sjkim        case ACPI_DMT_UINT48:
851167802Sjkim        case ACPI_DMT_UINT56:
852228110Sjkim        case ACPI_DMT_UINT64:
853228110Sjkim            /*
854228110Sjkim             * Dump bytes - high byte first, low byte last.
855228110Sjkim             * Note: All ACPI tables are little-endian.
856228110Sjkim             */
857228110Sjkim            for (Temp8 = (UINT8) ByteLength; Temp8 > 0; Temp8--)
858193529Sjkim            {
859228110Sjkim                AcpiOsPrintf ("%2.2X", Target[Temp8 - 1]);
860193529Sjkim            }
861193529Sjkim            AcpiOsPrintf ("\n");
862167802Sjkim            break;
863167802Sjkim
864218590Sjkim        case ACPI_DMT_BUF7:
865197104Sjkim        case ACPI_DMT_BUF16:
866219707Sjkim        case ACPI_DMT_BUF128:
867218590Sjkim            /*
868218590Sjkim             * Buffer: Size depends on the opcode and was set above.
869218590Sjkim             * Each hex byte is separated with a space.
870220663Sjkim             * Multiple lines are separated by line continuation char.
871218590Sjkim             */
872219707Sjkim            for (Temp16 = 0; Temp16 < ByteLength; Temp16++)
873197104Sjkim            {
874219707Sjkim                AcpiOsPrintf ("%2.2X", Target[Temp16]);
875219707Sjkim                if ((UINT32) (Temp16 + 1) < ByteLength)
876209746Sjkim                {
877219707Sjkim                    if ((Temp16 > 0) && (!((Temp16+1) % 16)))
878219707Sjkim                    {
879220663Sjkim                        AcpiOsPrintf (" \\\n"); /* Line continuation */
880219707Sjkim                        AcpiDmLineHeader (0, 0, NULL);
881219707Sjkim                    }
882219707Sjkim                    else
883219707Sjkim                    {
884219707Sjkim                        AcpiOsPrintf (" ");
885219707Sjkim                    }
886209746Sjkim                }
887197104Sjkim            }
888197104Sjkim            AcpiOsPrintf ("\n");
889197104Sjkim            break;
890197104Sjkim
891217365Sjkim        case ACPI_DMT_UUID:
892217365Sjkim
893217365Sjkim            /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */
894217365Sjkim
895217365Sjkim            (void) AuConvertUuidToString ((char *) Target, MsgBuffer);
896217365Sjkim
897217365Sjkim            AcpiOsPrintf ("%s\n", MsgBuffer);
898217365Sjkim            break;
899217365Sjkim
900167802Sjkim        case ACPI_DMT_STRING:
901167802Sjkim
902197104Sjkim            AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target));
903167802Sjkim            break;
904167802Sjkim
905167802Sjkim        /* Fixed length ASCII name fields */
906167802Sjkim
907167802Sjkim        case ACPI_DMT_SIG:
908167802Sjkim
909197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 4);
910197104Sjkim            AcpiOsPrintf ("\"%.4s\"    ", RepairedName);
911167802Sjkim            TableData = AcpiDmGetTableData (ACPI_CAST_PTR (char, Target));
912167802Sjkim            if (TableData)
913167802Sjkim            {
914220663Sjkim                AcpiOsPrintf (STRING_FORMAT, TableData->Name);
915167802Sjkim            }
916220663Sjkim            else
917220663Sjkim            {
918220663Sjkim                AcpiOsPrintf ("\n");
919220663Sjkim            }
920167802Sjkim            break;
921167802Sjkim
922167802Sjkim        case ACPI_DMT_NAME4:
923167802Sjkim
924197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 4);
925197104Sjkim            AcpiOsPrintf ("\"%.4s\"\n", RepairedName);
926167802Sjkim            break;
927167802Sjkim
928167802Sjkim        case ACPI_DMT_NAME6:
929167802Sjkim
930197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 6);
931197104Sjkim            AcpiOsPrintf ("\"%.6s\"\n", RepairedName);
932167802Sjkim            break;
933167802Sjkim
934167802Sjkim        case ACPI_DMT_NAME8:
935167802Sjkim
936197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 8);
937197104Sjkim            AcpiOsPrintf ("\"%.8s\"\n", RepairedName);
938167802Sjkim            break;
939167802Sjkim
940167802Sjkim        /* Special Data Types */
941167802Sjkim
942167802Sjkim        case ACPI_DMT_CHKSUM:
943167802Sjkim
944167802Sjkim            /* Checksum, display and validate */
945167802Sjkim
946167802Sjkim            AcpiOsPrintf ("%2.2X", *Target);
947209746Sjkim            Temp8 = AcpiDmGenerateChecksum (Table,
948209746Sjkim                        ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
949209746Sjkim                        ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum);
950167802Sjkim            if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
951167802Sjkim            {
952167802Sjkim                AcpiOsPrintf (
953167802Sjkim                    "     /* Incorrect checksum, should be %2.2X */", Temp8);
954167802Sjkim            }
955167802Sjkim            AcpiOsPrintf ("\n");
956167802Sjkim            break;
957167802Sjkim
958167802Sjkim        case ACPI_DMT_SPACEID:
959167802Sjkim
960167802Sjkim            /* Address Space ID */
961167802Sjkim
962220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target));
963167802Sjkim            break;
964167802Sjkim
965216471Sjkim        case ACPI_DMT_ACCWIDTH:
966216471Sjkim
967216471Sjkim            /* Encoded Access Width */
968216471Sjkim
969216471Sjkim            Temp8 = *Target;
970216471Sjkim            if (Temp8 > ACPI_GAS_WIDTH_RESERVED)
971216471Sjkim            {
972216471Sjkim                Temp8 = ACPI_GAS_WIDTH_RESERVED;
973216471Sjkim            }
974216471Sjkim
975220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, Temp8, AcpiDmGasAccessWidth[Temp8]);
976216471Sjkim            break;
977216471Sjkim
978167802Sjkim        case ACPI_DMT_GAS:
979167802Sjkim
980167802Sjkim            /* Generic Address Structure */
981167802Sjkim
982220663Sjkim            AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure");
983197104Sjkim            AcpiDmDumpTable (TableLength, CurrentOffset, Target,
984197104Sjkim                sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas);
985193529Sjkim            AcpiOsPrintf ("\n");
986193529Sjkim            LastOutputBlankLine = TRUE;
987167802Sjkim            break;
988167802Sjkim
989193529Sjkim        case ACPI_DMT_ASF:
990193529Sjkim
991193529Sjkim            /* ASF subtable types */
992193529Sjkim
993193529Sjkim            Temp16 = (UINT16) ((*Target) & 0x7F);  /* Top bit can be zero or one */
994193529Sjkim            if (Temp16 > ACPI_ASF_TYPE_RESERVED)
995193529Sjkim            {
996193529Sjkim                Temp16 = ACPI_ASF_TYPE_RESERVED;
997193529Sjkim            }
998193529Sjkim
999220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]);
1000193529Sjkim            break;
1001193529Sjkim
1002167802Sjkim        case ACPI_DMT_DMAR:
1003167802Sjkim
1004167802Sjkim            /* DMAR subtable types */
1005167802Sjkim
1006193529Sjkim            Temp16 = ACPI_GET16 (Target);
1007167802Sjkim            if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
1008167802Sjkim            {
1009167802Sjkim                Temp16 = ACPI_DMAR_TYPE_RESERVED;
1010167802Sjkim            }
1011167802Sjkim
1012220663Sjkim            AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmDmarSubnames[Temp16]);
1013167802Sjkim            break;
1014167802Sjkim
1015209746Sjkim        case ACPI_DMT_EINJACT:
1016209746Sjkim
1017209746Sjkim            /* EINJ Action types */
1018209746Sjkim
1019209746Sjkim            Temp8 = *Target;
1020209746Sjkim            if (Temp8 > ACPI_EINJ_ACTION_RESERVED)
1021209746Sjkim            {
1022209746Sjkim                Temp8 = ACPI_EINJ_ACTION_RESERVED;
1023209746Sjkim            }
1024209746Sjkim
1025220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmEinjActions[Temp8]);
1026209746Sjkim            break;
1027209746Sjkim
1028209746Sjkim        case ACPI_DMT_EINJINST:
1029209746Sjkim
1030209746Sjkim            /* EINJ Instruction types */
1031209746Sjkim
1032209746Sjkim            Temp8 = *Target;
1033209746Sjkim            if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED)
1034209746Sjkim            {
1035209746Sjkim                Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED;
1036209746Sjkim            }
1037209746Sjkim
1038220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmEinjInstructions[Temp8]);
1039209746Sjkim            break;
1040209746Sjkim
1041209746Sjkim        case ACPI_DMT_ERSTACT:
1042209746Sjkim
1043209746Sjkim            /* ERST Action types */
1044209746Sjkim
1045209746Sjkim            Temp8 = *Target;
1046209746Sjkim            if (Temp8 > ACPI_ERST_ACTION_RESERVED)
1047209746Sjkim            {
1048209746Sjkim                Temp8 = ACPI_ERST_ACTION_RESERVED;
1049209746Sjkim            }
1050209746Sjkim
1051220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmErstActions[Temp8]);
1052209746Sjkim            break;
1053209746Sjkim
1054209746Sjkim        case ACPI_DMT_ERSTINST:
1055209746Sjkim
1056209746Sjkim            /* ERST Instruction types */
1057209746Sjkim
1058209746Sjkim            Temp8 = *Target;
1059209746Sjkim            if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED)
1060209746Sjkim            {
1061209746Sjkim                Temp8 = ACPI_ERST_INSTRUCTION_RESERVED;
1062209746Sjkim            }
1063209746Sjkim
1064220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmErstInstructions[Temp8]);
1065209746Sjkim            break;
1066209746Sjkim
1067193529Sjkim        case ACPI_DMT_HEST:
1068193529Sjkim
1069193529Sjkim            /* HEST subtable types */
1070193529Sjkim
1071193529Sjkim            Temp16 = ACPI_GET16 (Target);
1072193529Sjkim            if (Temp16 > ACPI_HEST_TYPE_RESERVED)
1073193529Sjkim            {
1074193529Sjkim                Temp16 = ACPI_HEST_TYPE_RESERVED;
1075193529Sjkim            }
1076193529Sjkim
1077220663Sjkim            AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmHestSubnames[Temp16]);
1078193529Sjkim            break;
1079193529Sjkim
1080193529Sjkim        case ACPI_DMT_HESTNTFY:
1081193529Sjkim
1082220663Sjkim            AcpiOsPrintf (STRING_FORMAT, "Hardware Error Notification Structure");
1083197104Sjkim            AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1084197104Sjkim                sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify);
1085193529Sjkim            AcpiOsPrintf ("\n");
1086193529Sjkim            LastOutputBlankLine = TRUE;
1087193529Sjkim            break;
1088193529Sjkim
1089193529Sjkim        case ACPI_DMT_HESTNTYP:
1090193529Sjkim
1091193529Sjkim            /* HEST Notify types */
1092193529Sjkim
1093193529Sjkim            Temp8 = *Target;
1094193529Sjkim            if (Temp8 > ACPI_HEST_NOTIFY_RESERVED)
1095193529Sjkim            {
1096193529Sjkim                Temp8 = ACPI_HEST_NOTIFY_RESERVED;
1097193529Sjkim            }
1098193529Sjkim
1099220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmHestNotifySubnames[Temp8]);
1100193529Sjkim            break;
1101193529Sjkim
1102167802Sjkim        case ACPI_DMT_MADT:
1103167802Sjkim
1104167802Sjkim            /* MADT subtable types */
1105167802Sjkim
1106167802Sjkim            Temp8 = *Target;
1107167802Sjkim            if (Temp8 > ACPI_MADT_TYPE_RESERVED)
1108167802Sjkim            {
1109167802Sjkim                Temp8 = ACPI_MADT_TYPE_RESERVED;
1110167802Sjkim            }
1111167802Sjkim
1112220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmMadtSubnames[Temp8]);
1113167802Sjkim            break;
1114167802Sjkim
1115228110Sjkim        case ACPI_DMT_PMTT:
1116228110Sjkim
1117228110Sjkim            /* PMTT subtable types */
1118228110Sjkim
1119228110Sjkim            Temp8 = *Target;
1120228110Sjkim            if (Temp8 > ACPI_PMTT_TYPE_RESERVED)
1121228110Sjkim            {
1122228110Sjkim                Temp8 = ACPI_PMTT_TYPE_RESERVED;
1123228110Sjkim            }
1124228110Sjkim
1125228110Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmPmttSubnames[Temp8]);
1126228110Sjkim            break;
1127228110Sjkim
1128219707Sjkim        case ACPI_DMT_SLIC:
1129219707Sjkim
1130219707Sjkim            /* SLIC subtable types */
1131219707Sjkim
1132219707Sjkim            Temp8 = *Target;
1133219707Sjkim            if (Temp8 > ACPI_SLIC_TYPE_RESERVED)
1134219707Sjkim            {
1135219707Sjkim                Temp8 = ACPI_SLIC_TYPE_RESERVED;
1136219707Sjkim            }
1137219707Sjkim
1138220663Sjkim            AcpiOsPrintf (UINT32_FORMAT, *Target, AcpiDmSlicSubnames[Temp8]);
1139219707Sjkim            break;
1140219707Sjkim
1141167802Sjkim        case ACPI_DMT_SRAT:
1142167802Sjkim
1143167802Sjkim            /* SRAT subtable types */
1144167802Sjkim
1145167802Sjkim            Temp8 = *Target;
1146167802Sjkim            if (Temp8 > ACPI_SRAT_TYPE_RESERVED)
1147167802Sjkim            {
1148167802Sjkim                Temp8 = ACPI_SRAT_TYPE_RESERVED;
1149167802Sjkim            }
1150167802Sjkim
1151220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmSratSubnames[Temp8]);
1152167802Sjkim            break;
1153167802Sjkim
1154193529Sjkim        case ACPI_DMT_FADTPM:
1155193529Sjkim
1156193529Sjkim            /* FADT Preferred PM Profile names */
1157193529Sjkim
1158193529Sjkim            Temp8 = *Target;
1159193529Sjkim            if (Temp8 > ACPI_FADT_PM_RESERVED)
1160193529Sjkim            {
1161193529Sjkim                Temp8 = ACPI_FADT_PM_RESERVED;
1162193529Sjkim            }
1163193529Sjkim
1164220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmFadtProfiles[Temp8]);
1165193529Sjkim            break;
1166193529Sjkim
1167197104Sjkim        case ACPI_DMT_IVRS:
1168197104Sjkim
1169197104Sjkim            /* IVRS subtable types */
1170197104Sjkim
1171197104Sjkim            Temp8 = *Target;
1172197104Sjkim            switch (Temp8)
1173197104Sjkim            {
1174197104Sjkim            case ACPI_IVRS_TYPE_HARDWARE:
1175250838Sjkim
1176197104Sjkim                Name = AcpiDmIvrsSubnames[0];
1177197104Sjkim                break;
1178197104Sjkim
1179197104Sjkim            case ACPI_IVRS_TYPE_MEMORY1:
1180197104Sjkim            case ACPI_IVRS_TYPE_MEMORY2:
1181197104Sjkim            case ACPI_IVRS_TYPE_MEMORY3:
1182250838Sjkim
1183197104Sjkim                Name = AcpiDmIvrsSubnames[1];
1184197104Sjkim                break;
1185197104Sjkim
1186197104Sjkim            default:
1187250838Sjkim
1188197104Sjkim                Name = AcpiDmIvrsSubnames[2];
1189197104Sjkim                break;
1190197104Sjkim            }
1191197104Sjkim
1192220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, Name);
1193197104Sjkim            break;
1194197104Sjkim
1195167802Sjkim        case ACPI_DMT_EXIT:
1196250838Sjkim
1197193529Sjkim            return (AE_OK);
1198167802Sjkim
1199167802Sjkim        default:
1200250838Sjkim
1201167802Sjkim            ACPI_ERROR ((AE_INFO,
1202204773Sjkim                "**** Invalid table opcode [0x%X] ****\n", Info->Opcode));
1203193529Sjkim            return (AE_SUPPORT);
1204167802Sjkim        }
1205167802Sjkim    }
1206193529Sjkim
1207193529Sjkim    if (TableOffset && !SubtableLength)
1208193529Sjkim    {
1209193529Sjkim        /* If this table is not the main table, subtable must have valid length */
1210193529Sjkim
1211193529Sjkim        AcpiOsPrintf ("Invalid zero length subtable\n");
1212193529Sjkim        return (AE_BAD_DATA);
1213193529Sjkim    }
1214193529Sjkim
1215193529Sjkim    return (AE_OK);
1216167802Sjkim}
1217167802Sjkim
1218167802Sjkim
1219167802Sjkim/*******************************************************************************
1220167802Sjkim *
1221167802Sjkim * FUNCTION:    AcpiDmCheckAscii
1222167802Sjkim *
1223167802Sjkim * PARAMETERS:  Name                - Ascii string
1224167802Sjkim *              Count               - Number of characters to check
1225167802Sjkim *
1226167802Sjkim * RETURN:      None
1227167802Sjkim *
1228167802Sjkim * DESCRIPTION: Ensure that the requested number of characters are printable
1229167802Sjkim *              Ascii characters. Sets non-printable and null chars to <space>.
1230167802Sjkim *
1231167802Sjkim ******************************************************************************/
1232167802Sjkim
1233167802Sjkimstatic void
1234167802SjkimAcpiDmCheckAscii (
1235167802Sjkim    UINT8                   *Name,
1236197104Sjkim    char                    *RepairedName,
1237167802Sjkim    UINT32                  Count)
1238167802Sjkim{
1239167802Sjkim    UINT32                  i;
1240167802Sjkim
1241167802Sjkim
1242167802Sjkim    for (i = 0; i < Count; i++)
1243167802Sjkim    {
1244198237Sjkim        RepairedName[i] = (char) Name[i];
1245197104Sjkim
1246197104Sjkim        if (!Name[i])
1247167802Sjkim        {
1248197104Sjkim            return;
1249167802Sjkim        }
1250197104Sjkim        if (!isprint (Name[i]))
1251197104Sjkim        {
1252197104Sjkim            RepairedName[i] = ' ';
1253197104Sjkim        }
1254167802Sjkim    }
1255167802Sjkim}
1256