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",
103252279Sjkim    "Set Error Type With Address",
104209746Sjkim    "Unknown Action"
105209746Sjkim};
106209746Sjkim
107209746Sjkimstatic const char           *AcpiDmEinjInstructions[] =
108209746Sjkim{
109209746Sjkim    "Read Register",
110209746Sjkim    "Read Register Value",
111209746Sjkim    "Write Register",
112209746Sjkim    "Write Register Value",
113209746Sjkim    "Noop",
114252279Sjkim    "Flush Cacheline",
115209746Sjkim    "Unknown Instruction"
116209746Sjkim};
117209746Sjkim
118209746Sjkimstatic const char           *AcpiDmErstActions[] =
119209746Sjkim{
120209746Sjkim    "Begin Write Operation",
121209746Sjkim    "Begin Read Operation",
122209746Sjkim    "Begin Clear Operation",
123209746Sjkim    "End Operation",
124209746Sjkim    "Set Record Offset",
125209746Sjkim    "Execute Operation",
126209746Sjkim    "Check Busy Status",
127209746Sjkim    "Get Command Status",
128209746Sjkim    "Get Record Identifier",
129209746Sjkim    "Set Record Identifier",
130209746Sjkim    "Get Record Count",
131209746Sjkim    "Begin Dummy Write",
132209746Sjkim    "Unused/Unknown Action",
133209746Sjkim    "Get Error Address Range",
134209746Sjkim    "Get Error Address Length",
135209746Sjkim    "Get Error Attributes",
136209746Sjkim    "Unknown Action"
137209746Sjkim};
138209746Sjkim
139209746Sjkimstatic const char           *AcpiDmErstInstructions[] =
140209746Sjkim{
141209746Sjkim    "Read Register",
142209746Sjkim    "Read Register Value",
143209746Sjkim    "Write Register",
144209746Sjkim    "Write Register Value",
145209746Sjkim    "Noop",
146209746Sjkim    "Load Var1",
147209746Sjkim    "Load Var2",
148209746Sjkim    "Store Var1",
149209746Sjkim    "Add",
150209746Sjkim    "Subtract",
151209746Sjkim    "Add Value",
152209746Sjkim    "Subtract Value",
153209746Sjkim    "Stall",
154209746Sjkim    "Stall While True",
155209746Sjkim    "Skip Next If True",
156209746Sjkim    "GoTo",
157209746Sjkim    "Set Source Address",
158209746Sjkim    "Set Destination Address",
159209746Sjkim    "Move Data",
160209746Sjkim    "Unknown Instruction"
161209746Sjkim};
162209746Sjkim
163193529Sjkimstatic const char           *AcpiDmHestSubnames[] =
164193529Sjkim{
165197104Sjkim    "IA-32 Machine Check Exception",
166197104Sjkim    "IA-32 Corrected Machine Check",
167197104Sjkim    "IA-32 Non-Maskable Interrupt",
168197104Sjkim    "Unknown SubTable Type",        /* 3 - Reserved */
169197104Sjkim    "Unknown SubTable Type",        /* 4 - Reserved */
170197104Sjkim    "Unknown SubTable Type",        /* 5 - Reserved */
171193529Sjkim    "PCI Express Root Port AER",
172193529Sjkim    "PCI Express AER (AER Endpoint)",
173193529Sjkim    "PCI Express/PCI-X Bridge AER",
174193529Sjkim    "Generic Hardware Error Source",
175193529Sjkim    "Unknown SubTable Type"         /* Reserved */
176193529Sjkim};
177193529Sjkim
178193529Sjkimstatic const char           *AcpiDmHestNotifySubnames[] =
179193529Sjkim{
180193529Sjkim    "Polled",
181193529Sjkim    "External Interrupt",
182193529Sjkim    "Local Interrupt",
183193529Sjkim    "SCI",
184193529Sjkim    "NMI",
185252279Sjkim    "CMCI",                         /* ACPI 5.0 */
186252279Sjkim    "MCE",                          /* ACPI 5.0 */
187193529Sjkim    "Unknown Notify Type"           /* Reserved */
188193529Sjkim};
189193529Sjkim
190167802Sjkimstatic const char           *AcpiDmMadtSubnames[] =
191167802Sjkim{
192167802Sjkim    "Processor Local APIC",         /* ACPI_MADT_TYPE_LOCAL_APIC */
193167802Sjkim    "I/O APIC",                     /* ACPI_MADT_TYPE_IO_APIC */
194167802Sjkim    "Interrupt Source Override",    /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */
195167802Sjkim    "NMI Source",                   /* ACPI_MADT_TYPE_NMI_SOURCE */
196167802Sjkim    "Local APIC NMI",               /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */
197167802Sjkim    "Local APIC Address Override",  /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */
198167802Sjkim    "I/O SAPIC",                    /* ACPI_MADT_TYPE_IO_SAPIC */
199167802Sjkim    "Local SAPIC",                  /* ACPI_MADT_TYPE_LOCAL_SAPIC */
200167802Sjkim    "Platform Interrupt Sources",   /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */
201193529Sjkim    "Processor Local x2APIC",       /* ACPI_MADT_TYPE_LOCAL_X2APIC */
202193529Sjkim    "Local x2APIC NMI",             /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */
203228110Sjkim    "Generic Interrupt Controller", /* ACPI_MADT_GENERIC_INTERRUPT */
204228110Sjkim    "Generic Interrupt Distributor",/* ACPI_MADT_GENERIC_DISTRIBUTOR */
205167802Sjkim    "Unknown SubTable Type"         /* Reserved */
206167802Sjkim};
207167802Sjkim
208228110Sjkimstatic const char           *AcpiDmPmttSubnames[] =
209228110Sjkim{
210228110Sjkim    "Socket",                       /* ACPI_PMTT_TYPE_SOCKET */
211228110Sjkim    "Memory Controller",            /* ACPI_PMTT_TYPE_CONTROLLER */
212228110Sjkim    "Physical Component (DIMM)",    /* ACPI_PMTT_TYPE_DIMM  */
213228110Sjkim    "Unknown SubTable Type"         /* Reserved */
214228110Sjkim};
215228110Sjkim
216219707Sjkimstatic const char           *AcpiDmSlicSubnames[] =
217219707Sjkim{
218219707Sjkim    "Public Key Structure",
219219707Sjkim    "Windows Marker Structure",
220219707Sjkim    "Unknown SubTable Type"         /* Reserved */
221219707Sjkim};
222219707Sjkim
223167802Sjkimstatic const char           *AcpiDmSratSubnames[] =
224167802Sjkim{
225167802Sjkim    "Processor Local APIC/SAPIC Affinity",
226167802Sjkim    "Memory Affinity",
227193529Sjkim    "Processor Local x2APIC Affinity",
228167802Sjkim    "Unknown SubTable Type"         /* Reserved */
229167802Sjkim};
230167802Sjkim
231197104Sjkimstatic const char           *AcpiDmIvrsSubnames[] =
232197104Sjkim{
233197104Sjkim    "Hardware Definition Block",
234197104Sjkim    "Memory Definition Block",
235197104Sjkim    "Unknown SubTable Type"         /* Reserved */
236197104Sjkim};
237167802Sjkim
238197104Sjkim
239229989Sjkim#define ACPI_FADT_PM_RESERVED       9
240193529Sjkim
241193529Sjkimstatic const char           *AcpiDmFadtProfiles[] =
242193529Sjkim{
243193529Sjkim    "Unspecified",
244193529Sjkim    "Desktop",
245193529Sjkim    "Mobile",
246193529Sjkim    "Workstation",
247193529Sjkim    "Enterprise Server",
248193529Sjkim    "SOHO Server",
249193529Sjkim    "Appliance PC",
250193529Sjkim    "Performance Server",
251229989Sjkim    "Tablet",
252193529Sjkim    "Unknown Profile Type"
253193529Sjkim};
254193529Sjkim
255216471Sjkim#define ACPI_GAS_WIDTH_RESERVED     5
256216471Sjkim
257216471Sjkimstatic const char           *AcpiDmGasAccessWidth[] =
258216471Sjkim{
259216471Sjkim    "Undefined/Legacy",
260216471Sjkim    "Byte Access:8",
261216471Sjkim    "Word Access:16",
262216471Sjkim    "DWord Access:32",
263216471Sjkim    "QWord Access:64",
264216471Sjkim    "Unknown Width Encoding"
265216471Sjkim};
266216471Sjkim
267216471Sjkim
268167802Sjkim/*******************************************************************************
269167802Sjkim *
270167802Sjkim * ACPI Table Data, indexed by signature.
271167802Sjkim *
272209746Sjkim * Each entry contains: Signature, Table Info, Handler, DtHandler,
273209746Sjkim *  Template, Description
274197104Sjkim *
275209746Sjkim * Simple tables have only a TableInfo structure, complex tables have a
276209746Sjkim * handler. This table must be NULL terminated. RSDP and FACS are
277209746Sjkim * special-cased elsewhere.
278167802Sjkim *
279167802Sjkim ******************************************************************************/
280167802Sjkim
281209746SjkimACPI_DMTABLE_DATA    AcpiDmTableData[] =
282167802Sjkim{
283209746Sjkim    {ACPI_SIG_ASF,  NULL,                   AcpiDmDumpAsf,  DtCompileAsf,   TemplateAsf,    "Alert Standard Format table"},
284209746Sjkim    {ACPI_SIG_BERT, AcpiDmTableInfoBert,    NULL,           NULL,           TemplateBert,   "Boot Error Record Table"},
285228110Sjkim    {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt,    NULL,           NULL,           TemplateBgrt,   "Boot Graphics Resource Table"},
286239340Sjkim    {ACPI_SIG_BOOT, AcpiDmTableInfoBoot,    NULL,           NULL,           TemplateBoot,   "Simple Boot Flag Table"},
287209746Sjkim    {ACPI_SIG_CPEP, NULL,                   AcpiDmDumpCpep, DtCompileCpep,  TemplateCpep,   "Corrected Platform Error Polling table"},
288245582Sjkim    {ACPI_SIG_CSRT, NULL,                   AcpiDmDumpCsrt, DtCompileCsrt,  TemplateCsrt,   "Core System Resource Table"},
289239340Sjkim    {ACPI_SIG_DBG2, NULL,                   AcpiDmDumpDbg2, NULL,           NULL,           "Debug Port table type 2"},
290209746Sjkim    {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp,    NULL,           NULL,           TemplateDbgp,   "Debug Port table"},
291209746Sjkim    {ACPI_SIG_DMAR, NULL,                   AcpiDmDumpDmar, DtCompileDmar,  TemplateDmar,   "DMA Remapping table"},
292209746Sjkim    {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt,    NULL,           NULL,           TemplateEcdt,   "Embedded Controller Boot Resources Table"},
293209746Sjkim    {ACPI_SIG_EINJ, NULL,                   AcpiDmDumpEinj, DtCompileEinj,  TemplateEinj,   "Error Injection table"},
294209746Sjkim    {ACPI_SIG_ERST, NULL,                   AcpiDmDumpErst, DtCompileErst,  TemplateErst,   "Error Record Serialization Table"},
295239340Sjkim    {ACPI_SIG_FADT, NULL,                   AcpiDmDumpFadt, DtCompileFadt,  TemplateFadt,   "Fixed ACPI Description Table (FADT)"},
296228110Sjkim    {ACPI_SIG_FPDT, NULL,                   AcpiDmDumpFpdt, DtCompileFpdt,  TemplateFpdt,   "Firmware Performance Data Table"},
297228110Sjkim    {ACPI_SIG_GTDT, AcpiDmTableInfoGtdt,    NULL,           NULL,           TemplateGtdt,   "Generic Timer Description Table"},
298209746Sjkim    {ACPI_SIG_HEST, NULL,                   AcpiDmDumpHest, DtCompileHest,  TemplateHest,   "Hardware Error Source Table"},
299209746Sjkim    {ACPI_SIG_HPET, AcpiDmTableInfoHpet,    NULL,           NULL,           TemplateHpet,   "High Precision Event Timer table"},
300209746Sjkim    {ACPI_SIG_IVRS, NULL,                   AcpiDmDumpIvrs, DtCompileIvrs,  TemplateIvrs,   "I/O Virtualization Reporting Structure"},
301239340Sjkim    {ACPI_SIG_MADT, NULL,                   AcpiDmDumpMadt, DtCompileMadt,  TemplateMadt,   "Multiple APIC Description Table (MADT)"},
302209746Sjkim    {ACPI_SIG_MCFG, NULL,                   AcpiDmDumpMcfg, DtCompileMcfg,  TemplateMcfg,   "Memory Mapped Configuration table"},
303209746Sjkim    {ACPI_SIG_MCHI, AcpiDmTableInfoMchi,    NULL,           NULL,           TemplateMchi,   "Management Controller Host Interface table"},
304228110Sjkim    {ACPI_SIG_MPST, AcpiDmTableInfoMpst,    AcpiDmDumpMpst, DtCompileMpst,  TemplateMpst,   "Memory Power State Table"},
305209746Sjkim    {ACPI_SIG_MSCT, NULL,                   AcpiDmDumpMsct, DtCompileMsct,  TemplateMsct,   "Maximum System Characteristics Table"},
306246849Sjkim    {ACPI_SIG_MTMR, NULL,                   AcpiDmDumpMtmr, DtCompileMtmr,  TemplateMtmr,   "MID Timer Table"},
307228110Sjkim    {ACPI_SIG_PCCT, NULL,                   AcpiDmDumpPcct, NULL,           NULL,           "Platform Communications Channel Table"},
308228110Sjkim    {ACPI_SIG_PMTT, NULL,                   AcpiDmDumpPmtt, DtCompilePmtt,  TemplatePmtt,   "Platform Memory Topology Table"},
309209746Sjkim    {ACPI_SIG_RSDT, NULL,                   AcpiDmDumpRsdt, DtCompileRsdt,  TemplateRsdt,   "Root System Description Table"},
310228110Sjkim    {ACPI_SIG_S3PT, NULL,                   NULL,           NULL,           TemplateS3pt,   "S3 Performance Table"},
311209746Sjkim    {ACPI_SIG_SBST, AcpiDmTableInfoSbst,    NULL,           NULL,           TemplateSbst,   "Smart Battery Specification Table"},
312219707Sjkim    {ACPI_SIG_SLIC, NULL,                   AcpiDmDumpSlic, DtCompileSlic,  TemplateSlic,   "Software Licensing Description Table"},
313209746Sjkim    {ACPI_SIG_SLIT, NULL,                   AcpiDmDumpSlit, DtCompileSlit,  TemplateSlit,   "System Locality Information Table"},
314209746Sjkim    {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr,    NULL,           NULL,           TemplateSpcr,   "Serial Port Console Redirection table"},
315209746Sjkim    {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi,    NULL,           NULL,           TemplateSpmi,   "Server Platform Management Interface table"},
316209746Sjkim    {ACPI_SIG_SRAT, NULL,                   AcpiDmDumpSrat, DtCompileSrat,  TemplateSrat,   "System Resource Affinity Table"},
317209746Sjkim    {ACPI_SIG_TCPA, AcpiDmTableInfoTcpa,    NULL,           NULL,           TemplateTcpa,   "Trusted Computing Platform Alliance table"},
318245582Sjkim    {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2,    NULL,           NULL,           TemplateTpm2,   "Trusted Platform Module hardware interface table"},
319217365Sjkim    {ACPI_SIG_UEFI, AcpiDmTableInfoUefi,    NULL,           DtCompileUefi,  TemplateUefi,   "UEFI Boot Optimization Table"},
320246849Sjkim    {ACPI_SIG_VRTC, AcpiDmTableInfoVrtc,    AcpiDmDumpVrtc, DtCompileVrtc,  TemplateVrtc,   "Virtual Real-Time Clock Table"},
321209746Sjkim    {ACPI_SIG_WAET, AcpiDmTableInfoWaet,    NULL,           NULL,           TemplateWaet,   "Windows ACPI Emulated Devices Table"},
322209746Sjkim    {ACPI_SIG_WDAT, NULL,                   AcpiDmDumpWdat, DtCompileWdat,  TemplateWdat,   "Watchdog Action Table"},
323209746Sjkim    {ACPI_SIG_WDDT, AcpiDmTableInfoWddt,    NULL,           NULL,           TemplateWddt,   "Watchdog Description Table"},
324209746Sjkim    {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt,    NULL,           NULL,           TemplateWdrt,   "Watchdog Resource Table"},
325209746Sjkim    {ACPI_SIG_XSDT, NULL,                   AcpiDmDumpXsdt, DtCompileXsdt,  TemplateXsdt,   "Extended System Description Table"},
326209746Sjkim    {NULL,          NULL,                   NULL,           NULL,           NULL,           NULL}
327167802Sjkim};
328167802Sjkim
329167802Sjkim
330167802Sjkim/*******************************************************************************
331167802Sjkim *
332209746Sjkim * FUNCTION:    AcpiDmGenerateChecksum
333167802Sjkim *
334209746Sjkim * PARAMETERS:  Table               - Pointer to table to be checksummed
335209746Sjkim *              Length              - Length of the table
336209746Sjkim *              OriginalChecksum    - Value of the checksum field
337167802Sjkim *
338167802Sjkim * RETURN:      8 bit checksum of buffer
339167802Sjkim *
340167802Sjkim * DESCRIPTION: Computes an 8 bit checksum of the table.
341167802Sjkim *
342167802Sjkim ******************************************************************************/
343167802Sjkim
344167802SjkimUINT8
345209746SjkimAcpiDmGenerateChecksum (
346209746Sjkim    void                    *Table,
347209746Sjkim    UINT32                  Length,
348209746Sjkim    UINT8                   OriginalChecksum)
349167802Sjkim{
350167802Sjkim    UINT8                   Checksum;
351167802Sjkim
352167802Sjkim
353167802Sjkim    /* Sum the entire table as-is */
354167802Sjkim
355209746Sjkim    Checksum = AcpiTbChecksum ((UINT8 *) Table, Length);
356167802Sjkim
357167802Sjkim    /* Subtract off the existing checksum value in the table */
358167802Sjkim
359209746Sjkim    Checksum = (UINT8) (Checksum - OriginalChecksum);
360167802Sjkim
361167802Sjkim    /* Compute the final checksum */
362167802Sjkim
363167802Sjkim    Checksum = (UINT8) (0 - Checksum);
364167802Sjkim    return (Checksum);
365167802Sjkim}
366167802Sjkim
367167802Sjkim
368167802Sjkim/*******************************************************************************
369167802Sjkim *
370167802Sjkim * FUNCTION:    AcpiDmGetTableData
371167802Sjkim *
372167802Sjkim * PARAMETERS:  Signature           - ACPI signature (4 chars) to match
373167802Sjkim *
374167802Sjkim * RETURN:      Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found.
375167802Sjkim *
376167802Sjkim * DESCRIPTION: Find a match in the global table of supported ACPI tables
377167802Sjkim *
378167802Sjkim ******************************************************************************/
379167802Sjkim
380209746SjkimACPI_DMTABLE_DATA *
381167802SjkimAcpiDmGetTableData (
382167802Sjkim    char                    *Signature)
383167802Sjkim{
384167802Sjkim    ACPI_DMTABLE_DATA       *TableData;
385167802Sjkim
386167802Sjkim
387167802Sjkim    for (TableData = AcpiDmTableData; TableData->Signature; TableData++)
388167802Sjkim    {
389167802Sjkim        if (ACPI_COMPARE_NAME (Signature, TableData->Signature))
390167802Sjkim        {
391167802Sjkim            return (TableData);
392167802Sjkim        }
393167802Sjkim    }
394167802Sjkim
395167802Sjkim    return (NULL);
396167802Sjkim}
397167802Sjkim
398167802Sjkim
399167802Sjkim/*******************************************************************************
400167802Sjkim *
401167802Sjkim * FUNCTION:    AcpiDmDumpDataTable
402167802Sjkim *
403167802Sjkim * PARAMETERS:  Table               - An ACPI table
404167802Sjkim *
405167802Sjkim * RETURN:      None.
406167802Sjkim *
407167802Sjkim * DESCRIPTION: Format the contents of an ACPI data table (any table other
408167802Sjkim *              than an SSDT or DSDT that does not contain executable AML code)
409167802Sjkim *
410167802Sjkim ******************************************************************************/
411167802Sjkim
412167802Sjkimvoid
413167802SjkimAcpiDmDumpDataTable (
414167802Sjkim    ACPI_TABLE_HEADER       *Table)
415167802Sjkim{
416193529Sjkim    ACPI_STATUS             Status;
417167802Sjkim    ACPI_DMTABLE_DATA       *TableData;
418167802Sjkim    UINT32                  Length;
419167802Sjkim
420167802Sjkim
421167802Sjkim    /* Ignore tables that contain AML */
422167802Sjkim
423167802Sjkim    if (AcpiUtIsAmlTable (Table))
424167802Sjkim    {
425241973Sjkim        if (Gbl_VerboseTemplates)
426241973Sjkim        {
427241973Sjkim            /* Dump the raw table data */
428241973Sjkim
429241973Sjkim            Length = Table->Length;
430241973Sjkim
431241973Sjkim            AcpiOsPrintf ("\n/*\n%s: Length %d (0x%X)\n\n",
432241973Sjkim                ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
433241973Sjkim            AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
434241973Sjkim                Length, DB_BYTE_DISPLAY, 0);
435241973Sjkim            AcpiOsPrintf (" */\n");
436241973Sjkim        }
437167802Sjkim        return;
438167802Sjkim    }
439167802Sjkim
440167802Sjkim    /*
441167802Sjkim     * Handle tables that don't use the common ACPI table header structure.
442228110Sjkim     * Currently, these are the FACS, RSDP, and S3PT.
443167802Sjkim     */
444167802Sjkim    if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS))
445167802Sjkim    {
446167802Sjkim        Length = Table->Length;
447167802Sjkim        AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs);
448167802Sjkim    }
449254745Sjkim    else if (ACPI_VALIDATE_RSDP_SIG (Table->Signature))
450167802Sjkim    {
451167802Sjkim        Length = AcpiDmDumpRsdp (Table);
452167802Sjkim    }
453228110Sjkim    else if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_S3PT))
454228110Sjkim    {
455228110Sjkim        Length = AcpiDmDumpS3pt (Table);
456228110Sjkim    }
457167802Sjkim    else
458167802Sjkim    {
459167802Sjkim        /*
460167802Sjkim         * All other tables must use the common ACPI table header, dump it now
461167802Sjkim         */
462167802Sjkim        Length = Table->Length;
463193529Sjkim        Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader);
464193529Sjkim        if (ACPI_FAILURE (Status))
465193529Sjkim        {
466193529Sjkim            return;
467193529Sjkim        }
468167802Sjkim        AcpiOsPrintf ("\n");
469167802Sjkim
470167802Sjkim        /* Match signature and dispatch appropriately */
471167802Sjkim
472167802Sjkim        TableData = AcpiDmGetTableData (Table->Signature);
473167802Sjkim        if (!TableData)
474167802Sjkim        {
475167802Sjkim            if (!ACPI_STRNCMP (Table->Signature, "OEM", 3))
476167802Sjkim            {
477167802Sjkim                AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n",
478167802Sjkim                    Table->Signature);
479167802Sjkim            }
480167802Sjkim            else
481167802Sjkim            {
482167802Sjkim                AcpiOsPrintf ("\n**** Unknown ACPI table type [%4.4s]\n\n",
483167802Sjkim                    Table->Signature);
484246849Sjkim                fprintf (stderr, "Unknown ACPI table signature [%4.4s], decoding header only\n",
485246849Sjkim                    Table->Signature);
486167802Sjkim            }
487167802Sjkim        }
488167802Sjkim        else if (TableData->TableHandler)
489167802Sjkim        {
490167802Sjkim            /* Complex table, has a handler */
491167802Sjkim
492167802Sjkim            TableData->TableHandler (Table);
493167802Sjkim        }
494167802Sjkim        else if (TableData->TableInfo)
495167802Sjkim        {
496167802Sjkim            /* Simple table, just walk the info table */
497167802Sjkim
498167802Sjkim            AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo);
499167802Sjkim        }
500167802Sjkim    }
501167802Sjkim
502209746Sjkim    if (!Gbl_DoTemplates || Gbl_VerboseTemplates)
503209746Sjkim    {
504209746Sjkim        /* Dump the raw table data */
505167802Sjkim
506217365Sjkim        AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n",
507217365Sjkim            ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
508241973Sjkim        AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
509241973Sjkim            Length, DB_BYTE_DISPLAY, 0);
510209746Sjkim    }
511167802Sjkim}
512167802Sjkim
513167802Sjkim
514167802Sjkim/*******************************************************************************
515167802Sjkim *
516167802Sjkim * FUNCTION:    AcpiDmLineHeader
517167802Sjkim *
518167802Sjkim * PARAMETERS:  Offset              - Current byte offset, from table start
519167802Sjkim *              ByteLength          - Length of the field in bytes, 0 for flags
520167802Sjkim *              Name                - Name of this field
521167802Sjkim *              Value               - Optional value, displayed on left of ':'
522167802Sjkim *
523167802Sjkim * RETURN:      None
524167802Sjkim *
525167802Sjkim * DESCRIPTION: Utility routines for formatting output lines. Displays the
526167802Sjkim *              current table offset in hex and decimal, the field length,
527167802Sjkim *              and the field name.
528167802Sjkim *
529167802Sjkim ******************************************************************************/
530167802Sjkim
531167802Sjkimvoid
532167802SjkimAcpiDmLineHeader (
533167802Sjkim    UINT32                  Offset,
534167802Sjkim    UINT32                  ByteLength,
535167802Sjkim    char                    *Name)
536167802Sjkim{
537167802Sjkim
538219707Sjkim    /* Allow a null name for fields that span multiple lines (large buffers) */
539219707Sjkim
540219707Sjkim    if (!Name)
541219707Sjkim    {
542219707Sjkim        Name = "";
543219707Sjkim    }
544219707Sjkim
545209746Sjkim    if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */
546167802Sjkim    {
547209746Sjkim        if (ByteLength)
548209746Sjkim        {
549219707Sjkim            AcpiOsPrintf ("[%.4d] %34s : ", ByteLength, Name);
550209746Sjkim        }
551209746Sjkim        else
552209746Sjkim        {
553220663Sjkim            if (*Name)
554220663Sjkim            {
555220663Sjkim                AcpiOsPrintf ("%41s : ", Name);
556220663Sjkim            }
557220663Sjkim            else
558220663Sjkim            {
559220663Sjkim                AcpiOsPrintf ("%41s   ", Name);
560220663Sjkim            }
561209746Sjkim        }
562167802Sjkim    }
563209746Sjkim    else /* Normal disassembler or verbose template */
564167802Sjkim    {
565209746Sjkim        if (ByteLength)
566209746Sjkim        {
567219707Sjkim            AcpiOsPrintf ("[%3.3Xh %4.4d% 4d] %28s : ",
568209746Sjkim                Offset, Offset, ByteLength, Name);
569209746Sjkim        }
570209746Sjkim        else
571209746Sjkim        {
572220663Sjkim            if (*Name)
573220663Sjkim            {
574220663Sjkim                AcpiOsPrintf ("%44s : ", Name);
575220663Sjkim            }
576220663Sjkim            else
577220663Sjkim            {
578220663Sjkim                AcpiOsPrintf ("%44s   ", Name);
579220663Sjkim            }
580209746Sjkim        }
581167802Sjkim    }
582167802Sjkim}
583167802Sjkim
584167802Sjkimvoid
585167802SjkimAcpiDmLineHeader2 (
586167802Sjkim    UINT32                  Offset,
587167802Sjkim    UINT32                  ByteLength,
588167802Sjkim    char                    *Name,
589167802Sjkim    UINT32                  Value)
590167802Sjkim{
591167802Sjkim
592209746Sjkim    if (Gbl_DoTemplates && !Gbl_VerboseTemplates) /* Terse template */
593167802Sjkim    {
594209746Sjkim        if (ByteLength)
595209746Sjkim        {
596220663Sjkim            AcpiOsPrintf ("[%.4d] %30s %3d : ",
597209746Sjkim                ByteLength, Name, Value);
598209746Sjkim        }
599209746Sjkim        else
600209746Sjkim        {
601209746Sjkim            AcpiOsPrintf ("%36s % 3d : ",
602209746Sjkim                Name, Value);
603209746Sjkim        }
604167802Sjkim    }
605209746Sjkim    else /* Normal disassembler or verbose template */
606167802Sjkim    {
607209746Sjkim        if (ByteLength)
608209746Sjkim        {
609220663Sjkim            AcpiOsPrintf ("[%3.3Xh %4.4d %3d] %24s %3d : ",
610209746Sjkim                Offset, Offset, ByteLength, Name, Value);
611209746Sjkim        }
612209746Sjkim        else
613209746Sjkim        {
614220663Sjkim            AcpiOsPrintf ("[%3.3Xh %4.4d   ] %24s %3d : ",
615209746Sjkim                Offset, Offset, Name, Value);
616209746Sjkim        }
617167802Sjkim    }
618167802Sjkim}
619167802Sjkim
620167802Sjkim
621167802Sjkim/*******************************************************************************
622167802Sjkim *
623167802Sjkim * FUNCTION:    AcpiDmDumpTable
624167802Sjkim *
625167802Sjkim * PARAMETERS:  TableLength         - Length of the entire ACPI table
626167802Sjkim *              TableOffset         - Starting offset within the table for this
627167802Sjkim *                                    sub-descriptor (0 if main table)
628167802Sjkim *              Table               - The ACPI table
629193529Sjkim *              SubtableLength      - Length of this sub-descriptor
630167802Sjkim *              Info                - Info table for this ACPI table
631167802Sjkim *
632167802Sjkim * RETURN:      None
633167802Sjkim *
634167802Sjkim * DESCRIPTION: Display ACPI table contents by walking the Info table.
635167802Sjkim *
636209746Sjkim * Note: This function must remain in sync with DtGetFieldLength.
637209746Sjkim *
638167802Sjkim ******************************************************************************/
639167802Sjkim
640193529SjkimACPI_STATUS
641167802SjkimAcpiDmDumpTable (
642167802Sjkim    UINT32                  TableLength,
643167802Sjkim    UINT32                  TableOffset,
644167802Sjkim    void                    *Table,
645167802Sjkim    UINT32                  SubtableLength,
646167802Sjkim    ACPI_DMTABLE_INFO       *Info)
647167802Sjkim{
648167802Sjkim    UINT8                   *Target;
649167802Sjkim    UINT32                  CurrentOffset;
650167802Sjkim    UINT32                  ByteLength;
651167802Sjkim    UINT8                   Temp8;
652167802Sjkim    UINT16                  Temp16;
653167802Sjkim    ACPI_DMTABLE_DATA       *TableData;
654197104Sjkim    const char              *Name;
655193529Sjkim    BOOLEAN                 LastOutputBlankLine = FALSE;
656197104Sjkim    char                    RepairedName[8];
657167802Sjkim
658167802Sjkim
659167802Sjkim    if (!Info)
660167802Sjkim    {
661167802Sjkim        AcpiOsPrintf ("Display not implemented\n");
662193529Sjkim        return (AE_NOT_IMPLEMENTED);
663167802Sjkim    }
664167802Sjkim
665167802Sjkim    /* Walk entire Info table; Null name terminates */
666167802Sjkim
667167802Sjkim    for (; Info->Name; Info++)
668167802Sjkim    {
669167802Sjkim        /*
670167802Sjkim         * Target points to the field within the ACPI Table. CurrentOffset is
671167802Sjkim         * the offset of the field from the start of the main table.
672167802Sjkim         */
673167802Sjkim        Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset);
674167802Sjkim        CurrentOffset = TableOffset + Info->Offset;
675167802Sjkim
676167802Sjkim        /* Check for beyond EOT or beyond subtable end */
677167802Sjkim
678167802Sjkim        if ((CurrentOffset >= TableLength) ||
679167802Sjkim            (SubtableLength && (Info->Offset >= SubtableLength)))
680167802Sjkim        {
681193529Sjkim            AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
682193529Sjkim            return (AE_BAD_DATA);
683167802Sjkim        }
684167802Sjkim
685167802Sjkim        /* Generate the byte length for this field */
686167802Sjkim
687167802Sjkim        switch (Info->Opcode)
688167802Sjkim        {
689167802Sjkim        case ACPI_DMT_UINT8:
690167802Sjkim        case ACPI_DMT_CHKSUM:
691167802Sjkim        case ACPI_DMT_SPACEID:
692216471Sjkim        case ACPI_DMT_ACCWIDTH:
693197104Sjkim        case ACPI_DMT_IVRS:
694167802Sjkim        case ACPI_DMT_MADT:
695228110Sjkim        case ACPI_DMT_PMTT:
696167802Sjkim        case ACPI_DMT_SRAT:
697193529Sjkim        case ACPI_DMT_ASF:
698193529Sjkim        case ACPI_DMT_HESTNTYP:
699193529Sjkim        case ACPI_DMT_FADTPM:
700209746Sjkim        case ACPI_DMT_EINJACT:
701209746Sjkim        case ACPI_DMT_EINJINST:
702209746Sjkim        case ACPI_DMT_ERSTACT:
703209746Sjkim        case ACPI_DMT_ERSTINST:
704250838Sjkim
705167802Sjkim            ByteLength = 1;
706167802Sjkim            break;
707250838Sjkim
708167802Sjkim        case ACPI_DMT_UINT16:
709167802Sjkim        case ACPI_DMT_DMAR:
710193529Sjkim        case ACPI_DMT_HEST:
711250838Sjkim
712167802Sjkim            ByteLength = 2;
713167802Sjkim            break;
714250838Sjkim
715167802Sjkim        case ACPI_DMT_UINT24:
716250838Sjkim
717167802Sjkim            ByteLength = 3;
718167802Sjkim            break;
719250838Sjkim
720167802Sjkim        case ACPI_DMT_UINT32:
721167802Sjkim        case ACPI_DMT_NAME4:
722167802Sjkim        case ACPI_DMT_SIG:
723219707Sjkim        case ACPI_DMT_SLIC:
724250838Sjkim
725167802Sjkim            ByteLength = 4;
726167802Sjkim            break;
727250838Sjkim
728228110Sjkim        case ACPI_DMT_UINT40:
729250838Sjkim
730228110Sjkim            ByteLength = 5;
731228110Sjkim            break;
732250838Sjkim
733228110Sjkim        case ACPI_DMT_UINT48:
734167802Sjkim        case ACPI_DMT_NAME6:
735250838Sjkim
736167802Sjkim            ByteLength = 6;
737167802Sjkim            break;
738250838Sjkim
739167802Sjkim        case ACPI_DMT_UINT56:
740218590Sjkim        case ACPI_DMT_BUF7:
741250838Sjkim
742167802Sjkim            ByteLength = 7;
743167802Sjkim            break;
744250838Sjkim
745167802Sjkim        case ACPI_DMT_UINT64:
746167802Sjkim        case ACPI_DMT_NAME8:
747250838Sjkim
748167802Sjkim            ByteLength = 8;
749167802Sjkim            break;
750250838Sjkim
751252279Sjkim        case ACPI_DMT_BUF10:
752252279Sjkim
753252279Sjkim            ByteLength = 10;
754252279Sjkim            break;
755252279Sjkim
756197104Sjkim        case ACPI_DMT_BUF16:
757217365Sjkim        case ACPI_DMT_UUID:
758250838Sjkim
759197104Sjkim            ByteLength = 16;
760197104Sjkim            break;
761250838Sjkim
762219707Sjkim        case ACPI_DMT_BUF128:
763250838Sjkim
764219707Sjkim            ByteLength = 128;
765219707Sjkim            break;
766250838Sjkim
767167802Sjkim        case ACPI_DMT_STRING:
768250838Sjkim
769167802Sjkim            ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1;
770167802Sjkim            break;
771250838Sjkim
772167802Sjkim        case ACPI_DMT_GAS:
773250838Sjkim
774193529Sjkim            if (!LastOutputBlankLine)
775193529Sjkim            {
776193529Sjkim                AcpiOsPrintf ("\n");
777193529Sjkim                LastOutputBlankLine = TRUE;
778193529Sjkim            }
779167802Sjkim            ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
780167802Sjkim            break;
781250838Sjkim
782193529Sjkim        case ACPI_DMT_HESTNTFY:
783250838Sjkim
784193529Sjkim            if (!LastOutputBlankLine)
785193529Sjkim            {
786193529Sjkim                AcpiOsPrintf ("\n");
787193529Sjkim                LastOutputBlankLine = TRUE;
788193529Sjkim            }
789193529Sjkim            ByteLength = sizeof (ACPI_HEST_NOTIFY);
790193529Sjkim            break;
791250838Sjkim
792167802Sjkim        default:
793250838Sjkim
794167802Sjkim            ByteLength = 0;
795167802Sjkim            break;
796167802Sjkim        }
797167802Sjkim
798193529Sjkim        if (CurrentOffset + ByteLength > TableLength)
799193529Sjkim        {
800193529Sjkim            AcpiOsPrintf ("**** ACPI table terminates in the middle of a data structure!\n");
801193529Sjkim            return (AE_BAD_DATA);
802193529Sjkim        }
803193529Sjkim
804228110Sjkim        if (Info->Opcode == ACPI_DMT_EXTRA_TEXT)
805228110Sjkim        {
806228110Sjkim            AcpiOsPrintf ("%s", Info->Name);
807228110Sjkim            continue;
808228110Sjkim        }
809228110Sjkim
810167802Sjkim        /* Start a new line and decode the opcode */
811167802Sjkim
812167802Sjkim        AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name);
813167802Sjkim
814167802Sjkim        switch (Info->Opcode)
815167802Sjkim        {
816167802Sjkim        /* Single-bit Flag fields. Note: Opcode is the bit position */
817167802Sjkim
818167802Sjkim        case ACPI_DMT_FLAG0:
819167802Sjkim        case ACPI_DMT_FLAG1:
820167802Sjkim        case ACPI_DMT_FLAG2:
821167802Sjkim        case ACPI_DMT_FLAG3:
822167802Sjkim        case ACPI_DMT_FLAG4:
823167802Sjkim        case ACPI_DMT_FLAG5:
824167802Sjkim        case ACPI_DMT_FLAG6:
825167802Sjkim        case ACPI_DMT_FLAG7:
826167802Sjkim
827167802Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01);
828167802Sjkim            break;
829167802Sjkim
830167802Sjkim        /* 2-bit Flag fields */
831167802Sjkim
832167802Sjkim        case ACPI_DMT_FLAGS0:
833167802Sjkim
834167802Sjkim            AcpiOsPrintf ("%1.1X\n", *Target & 0x03);
835167802Sjkim            break;
836167802Sjkim
837228110Sjkim        case ACPI_DMT_FLAGS1:
838228110Sjkim
839228110Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> 1) & 0x03);
840228110Sjkim            break;
841228110Sjkim
842167802Sjkim        case ACPI_DMT_FLAGS2:
843167802Sjkim
844167802Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03);
845167802Sjkim            break;
846167802Sjkim
847228110Sjkim        case ACPI_DMT_FLAGS4:
848167802Sjkim
849228110Sjkim            AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03);
850167802Sjkim            break;
851167802Sjkim
852228110Sjkim        /* Integer Data Types */
853228110Sjkim
854228110Sjkim        case ACPI_DMT_UINT8:
855167802Sjkim        case ACPI_DMT_UINT16:
856167802Sjkim        case ACPI_DMT_UINT24:
857167802Sjkim        case ACPI_DMT_UINT32:
858228110Sjkim        case ACPI_DMT_UINT40:
859228110Sjkim        case ACPI_DMT_UINT48:
860167802Sjkim        case ACPI_DMT_UINT56:
861228110Sjkim        case ACPI_DMT_UINT64:
862228110Sjkim            /*
863228110Sjkim             * Dump bytes - high byte first, low byte last.
864228110Sjkim             * Note: All ACPI tables are little-endian.
865228110Sjkim             */
866228110Sjkim            for (Temp8 = (UINT8) ByteLength; Temp8 > 0; Temp8--)
867193529Sjkim            {
868228110Sjkim                AcpiOsPrintf ("%2.2X", Target[Temp8 - 1]);
869193529Sjkim            }
870193529Sjkim            AcpiOsPrintf ("\n");
871167802Sjkim            break;
872167802Sjkim
873218590Sjkim        case ACPI_DMT_BUF7:
874252279Sjkim        case ACPI_DMT_BUF10:
875197104Sjkim        case ACPI_DMT_BUF16:
876219707Sjkim        case ACPI_DMT_BUF128:
877218590Sjkim            /*
878218590Sjkim             * Buffer: Size depends on the opcode and was set above.
879218590Sjkim             * Each hex byte is separated with a space.
880220663Sjkim             * Multiple lines are separated by line continuation char.
881218590Sjkim             */
882219707Sjkim            for (Temp16 = 0; Temp16 < ByteLength; Temp16++)
883197104Sjkim            {
884219707Sjkim                AcpiOsPrintf ("%2.2X", Target[Temp16]);
885219707Sjkim                if ((UINT32) (Temp16 + 1) < ByteLength)
886209746Sjkim                {
887219707Sjkim                    if ((Temp16 > 0) && (!((Temp16+1) % 16)))
888219707Sjkim                    {
889220663Sjkim                        AcpiOsPrintf (" \\\n"); /* Line continuation */
890219707Sjkim                        AcpiDmLineHeader (0, 0, NULL);
891219707Sjkim                    }
892219707Sjkim                    else
893219707Sjkim                    {
894219707Sjkim                        AcpiOsPrintf (" ");
895219707Sjkim                    }
896209746Sjkim                }
897197104Sjkim            }
898197104Sjkim            AcpiOsPrintf ("\n");
899197104Sjkim            break;
900197104Sjkim
901217365Sjkim        case ACPI_DMT_UUID:
902217365Sjkim
903217365Sjkim            /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */
904217365Sjkim
905217365Sjkim            (void) AuConvertUuidToString ((char *) Target, MsgBuffer);
906217365Sjkim
907217365Sjkim            AcpiOsPrintf ("%s\n", MsgBuffer);
908217365Sjkim            break;
909217365Sjkim
910167802Sjkim        case ACPI_DMT_STRING:
911167802Sjkim
912197104Sjkim            AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target));
913167802Sjkim            break;
914167802Sjkim
915167802Sjkim        /* Fixed length ASCII name fields */
916167802Sjkim
917167802Sjkim        case ACPI_DMT_SIG:
918167802Sjkim
919197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 4);
920197104Sjkim            AcpiOsPrintf ("\"%.4s\"    ", RepairedName);
921167802Sjkim            TableData = AcpiDmGetTableData (ACPI_CAST_PTR (char, Target));
922167802Sjkim            if (TableData)
923167802Sjkim            {
924220663Sjkim                AcpiOsPrintf (STRING_FORMAT, TableData->Name);
925167802Sjkim            }
926220663Sjkim            else
927220663Sjkim            {
928220663Sjkim                AcpiOsPrintf ("\n");
929220663Sjkim            }
930167802Sjkim            break;
931167802Sjkim
932167802Sjkim        case ACPI_DMT_NAME4:
933167802Sjkim
934197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 4);
935197104Sjkim            AcpiOsPrintf ("\"%.4s\"\n", RepairedName);
936167802Sjkim            break;
937167802Sjkim
938167802Sjkim        case ACPI_DMT_NAME6:
939167802Sjkim
940197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 6);
941197104Sjkim            AcpiOsPrintf ("\"%.6s\"\n", RepairedName);
942167802Sjkim            break;
943167802Sjkim
944167802Sjkim        case ACPI_DMT_NAME8:
945167802Sjkim
946197104Sjkim            AcpiDmCheckAscii (Target, RepairedName, 8);
947197104Sjkim            AcpiOsPrintf ("\"%.8s\"\n", RepairedName);
948167802Sjkim            break;
949167802Sjkim
950167802Sjkim        /* Special Data Types */
951167802Sjkim
952167802Sjkim        case ACPI_DMT_CHKSUM:
953167802Sjkim
954167802Sjkim            /* Checksum, display and validate */
955167802Sjkim
956167802Sjkim            AcpiOsPrintf ("%2.2X", *Target);
957209746Sjkim            Temp8 = AcpiDmGenerateChecksum (Table,
958209746Sjkim                        ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
959209746Sjkim                        ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum);
960167802Sjkim            if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
961167802Sjkim            {
962167802Sjkim                AcpiOsPrintf (
963167802Sjkim                    "     /* Incorrect checksum, should be %2.2X */", Temp8);
964167802Sjkim            }
965167802Sjkim            AcpiOsPrintf ("\n");
966167802Sjkim            break;
967167802Sjkim
968167802Sjkim        case ACPI_DMT_SPACEID:
969167802Sjkim
970167802Sjkim            /* Address Space ID */
971167802Sjkim
972220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target));
973167802Sjkim            break;
974167802Sjkim
975216471Sjkim        case ACPI_DMT_ACCWIDTH:
976216471Sjkim
977216471Sjkim            /* Encoded Access Width */
978216471Sjkim
979216471Sjkim            Temp8 = *Target;
980216471Sjkim            if (Temp8 > ACPI_GAS_WIDTH_RESERVED)
981216471Sjkim            {
982216471Sjkim                Temp8 = ACPI_GAS_WIDTH_RESERVED;
983216471Sjkim            }
984216471Sjkim
985220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, Temp8, AcpiDmGasAccessWidth[Temp8]);
986216471Sjkim            break;
987216471Sjkim
988167802Sjkim        case ACPI_DMT_GAS:
989167802Sjkim
990167802Sjkim            /* Generic Address Structure */
991167802Sjkim
992220663Sjkim            AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure");
993197104Sjkim            AcpiDmDumpTable (TableLength, CurrentOffset, Target,
994197104Sjkim                sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas);
995193529Sjkim            AcpiOsPrintf ("\n");
996193529Sjkim            LastOutputBlankLine = TRUE;
997167802Sjkim            break;
998167802Sjkim
999193529Sjkim        case ACPI_DMT_ASF:
1000193529Sjkim
1001193529Sjkim            /* ASF subtable types */
1002193529Sjkim
1003193529Sjkim            Temp16 = (UINT16) ((*Target) & 0x7F);  /* Top bit can be zero or one */
1004193529Sjkim            if (Temp16 > ACPI_ASF_TYPE_RESERVED)
1005193529Sjkim            {
1006193529Sjkim                Temp16 = ACPI_ASF_TYPE_RESERVED;
1007193529Sjkim            }
1008193529Sjkim
1009220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]);
1010193529Sjkim            break;
1011193529Sjkim
1012167802Sjkim        case ACPI_DMT_DMAR:
1013167802Sjkim
1014167802Sjkim            /* DMAR subtable types */
1015167802Sjkim
1016193529Sjkim            Temp16 = ACPI_GET16 (Target);
1017167802Sjkim            if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
1018167802Sjkim            {
1019167802Sjkim                Temp16 = ACPI_DMAR_TYPE_RESERVED;
1020167802Sjkim            }
1021167802Sjkim
1022220663Sjkim            AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmDmarSubnames[Temp16]);
1023167802Sjkim            break;
1024167802Sjkim
1025209746Sjkim        case ACPI_DMT_EINJACT:
1026209746Sjkim
1027209746Sjkim            /* EINJ Action types */
1028209746Sjkim
1029209746Sjkim            Temp8 = *Target;
1030209746Sjkim            if (Temp8 > ACPI_EINJ_ACTION_RESERVED)
1031209746Sjkim            {
1032209746Sjkim                Temp8 = ACPI_EINJ_ACTION_RESERVED;
1033209746Sjkim            }
1034209746Sjkim
1035220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmEinjActions[Temp8]);
1036209746Sjkim            break;
1037209746Sjkim
1038209746Sjkim        case ACPI_DMT_EINJINST:
1039209746Sjkim
1040209746Sjkim            /* EINJ Instruction types */
1041209746Sjkim
1042209746Sjkim            Temp8 = *Target;
1043209746Sjkim            if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED)
1044209746Sjkim            {
1045209746Sjkim                Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED;
1046209746Sjkim            }
1047209746Sjkim
1048220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmEinjInstructions[Temp8]);
1049209746Sjkim            break;
1050209746Sjkim
1051209746Sjkim        case ACPI_DMT_ERSTACT:
1052209746Sjkim
1053209746Sjkim            /* ERST Action types */
1054209746Sjkim
1055209746Sjkim            Temp8 = *Target;
1056209746Sjkim            if (Temp8 > ACPI_ERST_ACTION_RESERVED)
1057209746Sjkim            {
1058209746Sjkim                Temp8 = ACPI_ERST_ACTION_RESERVED;
1059209746Sjkim            }
1060209746Sjkim
1061220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmErstActions[Temp8]);
1062209746Sjkim            break;
1063209746Sjkim
1064209746Sjkim        case ACPI_DMT_ERSTINST:
1065209746Sjkim
1066209746Sjkim            /* ERST Instruction types */
1067209746Sjkim
1068209746Sjkim            Temp8 = *Target;
1069209746Sjkim            if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED)
1070209746Sjkim            {
1071209746Sjkim                Temp8 = ACPI_ERST_INSTRUCTION_RESERVED;
1072209746Sjkim            }
1073209746Sjkim
1074220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmErstInstructions[Temp8]);
1075209746Sjkim            break;
1076209746Sjkim
1077193529Sjkim        case ACPI_DMT_HEST:
1078193529Sjkim
1079193529Sjkim            /* HEST subtable types */
1080193529Sjkim
1081193529Sjkim            Temp16 = ACPI_GET16 (Target);
1082193529Sjkim            if (Temp16 > ACPI_HEST_TYPE_RESERVED)
1083193529Sjkim            {
1084193529Sjkim                Temp16 = ACPI_HEST_TYPE_RESERVED;
1085193529Sjkim            }
1086193529Sjkim
1087220663Sjkim            AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target), AcpiDmHestSubnames[Temp16]);
1088193529Sjkim            break;
1089193529Sjkim
1090193529Sjkim        case ACPI_DMT_HESTNTFY:
1091193529Sjkim
1092220663Sjkim            AcpiOsPrintf (STRING_FORMAT, "Hardware Error Notification Structure");
1093197104Sjkim            AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1094197104Sjkim                sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify);
1095193529Sjkim            AcpiOsPrintf ("\n");
1096193529Sjkim            LastOutputBlankLine = TRUE;
1097193529Sjkim            break;
1098193529Sjkim
1099193529Sjkim        case ACPI_DMT_HESTNTYP:
1100193529Sjkim
1101193529Sjkim            /* HEST Notify types */
1102193529Sjkim
1103193529Sjkim            Temp8 = *Target;
1104193529Sjkim            if (Temp8 > ACPI_HEST_NOTIFY_RESERVED)
1105193529Sjkim            {
1106193529Sjkim                Temp8 = ACPI_HEST_NOTIFY_RESERVED;
1107193529Sjkim            }
1108193529Sjkim
1109220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmHestNotifySubnames[Temp8]);
1110193529Sjkim            break;
1111193529Sjkim
1112167802Sjkim        case ACPI_DMT_MADT:
1113167802Sjkim
1114167802Sjkim            /* MADT subtable types */
1115167802Sjkim
1116167802Sjkim            Temp8 = *Target;
1117167802Sjkim            if (Temp8 > ACPI_MADT_TYPE_RESERVED)
1118167802Sjkim            {
1119167802Sjkim                Temp8 = ACPI_MADT_TYPE_RESERVED;
1120167802Sjkim            }
1121167802Sjkim
1122220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmMadtSubnames[Temp8]);
1123167802Sjkim            break;
1124167802Sjkim
1125228110Sjkim        case ACPI_DMT_PMTT:
1126228110Sjkim
1127228110Sjkim            /* PMTT subtable types */
1128228110Sjkim
1129228110Sjkim            Temp8 = *Target;
1130228110Sjkim            if (Temp8 > ACPI_PMTT_TYPE_RESERVED)
1131228110Sjkim            {
1132228110Sjkim                Temp8 = ACPI_PMTT_TYPE_RESERVED;
1133228110Sjkim            }
1134228110Sjkim
1135228110Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmPmttSubnames[Temp8]);
1136228110Sjkim            break;
1137228110Sjkim
1138219707Sjkim        case ACPI_DMT_SLIC:
1139219707Sjkim
1140219707Sjkim            /* SLIC subtable types */
1141219707Sjkim
1142219707Sjkim            Temp8 = *Target;
1143219707Sjkim            if (Temp8 > ACPI_SLIC_TYPE_RESERVED)
1144219707Sjkim            {
1145219707Sjkim                Temp8 = ACPI_SLIC_TYPE_RESERVED;
1146219707Sjkim            }
1147219707Sjkim
1148220663Sjkim            AcpiOsPrintf (UINT32_FORMAT, *Target, AcpiDmSlicSubnames[Temp8]);
1149219707Sjkim            break;
1150219707Sjkim
1151167802Sjkim        case ACPI_DMT_SRAT:
1152167802Sjkim
1153167802Sjkim            /* SRAT subtable types */
1154167802Sjkim
1155167802Sjkim            Temp8 = *Target;
1156167802Sjkim            if (Temp8 > ACPI_SRAT_TYPE_RESERVED)
1157167802Sjkim            {
1158167802Sjkim                Temp8 = ACPI_SRAT_TYPE_RESERVED;
1159167802Sjkim            }
1160167802Sjkim
1161220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmSratSubnames[Temp8]);
1162167802Sjkim            break;
1163167802Sjkim
1164193529Sjkim        case ACPI_DMT_FADTPM:
1165193529Sjkim
1166193529Sjkim            /* FADT Preferred PM Profile names */
1167193529Sjkim
1168193529Sjkim            Temp8 = *Target;
1169193529Sjkim            if (Temp8 > ACPI_FADT_PM_RESERVED)
1170193529Sjkim            {
1171193529Sjkim                Temp8 = ACPI_FADT_PM_RESERVED;
1172193529Sjkim            }
1173193529Sjkim
1174220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmFadtProfiles[Temp8]);
1175193529Sjkim            break;
1176193529Sjkim
1177197104Sjkim        case ACPI_DMT_IVRS:
1178197104Sjkim
1179197104Sjkim            /* IVRS subtable types */
1180197104Sjkim
1181197104Sjkim            Temp8 = *Target;
1182197104Sjkim            switch (Temp8)
1183197104Sjkim            {
1184197104Sjkim            case ACPI_IVRS_TYPE_HARDWARE:
1185250838Sjkim
1186197104Sjkim                Name = AcpiDmIvrsSubnames[0];
1187197104Sjkim                break;
1188197104Sjkim
1189197104Sjkim            case ACPI_IVRS_TYPE_MEMORY1:
1190197104Sjkim            case ACPI_IVRS_TYPE_MEMORY2:
1191197104Sjkim            case ACPI_IVRS_TYPE_MEMORY3:
1192250838Sjkim
1193197104Sjkim                Name = AcpiDmIvrsSubnames[1];
1194197104Sjkim                break;
1195197104Sjkim
1196197104Sjkim            default:
1197250838Sjkim
1198197104Sjkim                Name = AcpiDmIvrsSubnames[2];
1199197104Sjkim                break;
1200197104Sjkim            }
1201197104Sjkim
1202220663Sjkim            AcpiOsPrintf (UINT8_FORMAT, *Target, Name);
1203197104Sjkim            break;
1204197104Sjkim
1205167802Sjkim        case ACPI_DMT_EXIT:
1206250838Sjkim
1207193529Sjkim            return (AE_OK);
1208167802Sjkim
1209167802Sjkim        default:
1210250838Sjkim
1211167802Sjkim            ACPI_ERROR ((AE_INFO,
1212204773Sjkim                "**** Invalid table opcode [0x%X] ****\n", Info->Opcode));
1213193529Sjkim            return (AE_SUPPORT);
1214167802Sjkim        }
1215167802Sjkim    }
1216193529Sjkim
1217193529Sjkim    if (TableOffset && !SubtableLength)
1218193529Sjkim    {
1219193529Sjkim        /* If this table is not the main table, subtable must have valid length */
1220193529Sjkim
1221193529Sjkim        AcpiOsPrintf ("Invalid zero length subtable\n");
1222193529Sjkim        return (AE_BAD_DATA);
1223193529Sjkim    }
1224193529Sjkim
1225193529Sjkim    return (AE_OK);
1226167802Sjkim}
1227167802Sjkim
1228167802Sjkim
1229167802Sjkim/*******************************************************************************
1230167802Sjkim *
1231167802Sjkim * FUNCTION:    AcpiDmCheckAscii
1232167802Sjkim *
1233167802Sjkim * PARAMETERS:  Name                - Ascii string
1234167802Sjkim *              Count               - Number of characters to check
1235167802Sjkim *
1236167802Sjkim * RETURN:      None
1237167802Sjkim *
1238167802Sjkim * DESCRIPTION: Ensure that the requested number of characters are printable
1239167802Sjkim *              Ascii characters. Sets non-printable and null chars to <space>.
1240167802Sjkim *
1241167802Sjkim ******************************************************************************/
1242167802Sjkim
1243167802Sjkimstatic void
1244167802SjkimAcpiDmCheckAscii (
1245167802Sjkim    UINT8                   *Name,
1246197104Sjkim    char                    *RepairedName,
1247167802Sjkim    UINT32                  Count)
1248167802Sjkim{
1249167802Sjkim    UINT32                  i;
1250167802Sjkim
1251167802Sjkim
1252167802Sjkim    for (i = 0; i < Count; i++)
1253167802Sjkim    {
1254198237Sjkim        RepairedName[i] = (char) Name[i];
1255197104Sjkim
1256197104Sjkim        if (!Name[i])
1257167802Sjkim        {
1258197104Sjkim            return;
1259167802Sjkim        }
1260197104Sjkim        if (!isprint (Name[i]))
1261197104Sjkim        {
1262197104Sjkim            RepairedName[i] = ' ';
1263197104Sjkim        }
1264167802Sjkim    }
1265167802Sjkim}
1266