dmtable.c revision 1.1.1.16 1 /******************************************************************************
2 *
3 * Module Name: dmtable - Support for ACPI tables that contain no AML code
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2019, Intel Corp.
9 * All rights reserved.
10 *
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions
13 * are met:
14 * 1. Redistributions of source code must retain the above copyright
15 * notice, this list of conditions, and the following disclaimer,
16 * without modification.
17 * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18 * substantially similar to the "NO WARRANTY" disclaimer below
19 * ("Disclaimer") and any redistribution must be conditioned upon
20 * including a substantially similar Disclaimer requirement for further
21 * binary redistribution.
22 * 3. Neither the names of the above-listed copyright holders nor the names
23 * of any contributors may be used to endorse or promote products derived
24 * from this software without specific prior written permission.
25 *
26 * Alternatively, this software may be distributed under the terms of the
27 * GNU General Public License ("GPL") version 2 as published by the Free
28 * Software Foundation.
29 *
30 * NO WARRANTY
31 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
33 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
34 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35 * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41 * POSSIBILITY OF SUCH DAMAGES.
42 */
43
44 #include "acpi.h"
45 #include "accommon.h"
46 #include "acdisasm.h"
47 #include "actables.h"
48 #include "aslcompiler.h"
49
50 /* This module used for application-level code only */
51
52 #define _COMPONENT ACPI_CA_DISASSEMBLER
53 ACPI_MODULE_NAME ("dmtable")
54
55 const AH_TABLE *
56 AcpiAhGetTableInfo (
57 char *Signature);
58
59
60 /* Common format strings for commented values */
61
62 #define UINT8_FORMAT "%2.2X [%s]\n"
63 #define UINT16_FORMAT "%4.4X [%s]\n"
64 #define UINT32_FORMAT "%8.8X [%s]\n"
65 #define STRING_FORMAT "[%s]\n"
66
67 /* These tables map a subtable type to a description string */
68
69 static const char *AcpiDmAsfSubnames[] =
70 {
71 "ASF Information",
72 "ASF Alerts",
73 "ASF Remote Control",
74 "ASF RMCP Boot Options",
75 "ASF Address",
76 "Unknown Subtable Type" /* Reserved */
77 };
78
79 static const char *AcpiDmDmarSubnames[] =
80 {
81 "Hardware Unit Definition",
82 "Reserved Memory Region",
83 "Root Port ATS Capability",
84 "Remapping Hardware Static Affinity",
85 "ACPI Namespace Device Declaration",
86 "Unknown Subtable Type" /* Reserved */
87 };
88
89 static const char *AcpiDmDmarScope[] =
90 {
91 "Reserved value",
92 "PCI Endpoint Device",
93 "PCI Bridge Device",
94 "IOAPIC Device",
95 "Message-capable HPET Device",
96 "Namespace Device",
97 "Unknown Scope Type" /* Reserved */
98 };
99
100 static const char *AcpiDmEinjActions[] =
101 {
102 "Begin Operation",
103 "Get Trigger Table",
104 "Set Error Type",
105 "Get Error Type",
106 "End Operation",
107 "Execute Operation",
108 "Check Busy Status",
109 "Get Command Status",
110 "Set Error Type With Address",
111 "Get Execute Timings",
112 "Unknown Action"
113 };
114
115 static const char *AcpiDmEinjInstructions[] =
116 {
117 "Read Register",
118 "Read Register Value",
119 "Write Register",
120 "Write Register Value",
121 "Noop",
122 "Flush Cacheline",
123 "Unknown Instruction"
124 };
125
126 static const char *AcpiDmErstActions[] =
127 {
128 "Begin Write Operation",
129 "Begin Read Operation",
130 "Begin Clear Operation",
131 "End Operation",
132 "Set Record Offset",
133 "Execute Operation",
134 "Check Busy Status",
135 "Get Command Status",
136 "Get Record Identifier",
137 "Set Record Identifier",
138 "Get Record Count",
139 "Begin Dummy Write",
140 "Unused/Unknown Action",
141 "Get Error Address Range",
142 "Get Error Address Length",
143 "Get Error Attributes",
144 "Execute Timings",
145 "Unknown Action"
146 };
147
148 static const char *AcpiDmErstInstructions[] =
149 {
150 "Read Register",
151 "Read Register Value",
152 "Write Register",
153 "Write Register Value",
154 "Noop",
155 "Load Var1",
156 "Load Var2",
157 "Store Var1",
158 "Add",
159 "Subtract",
160 "Add Value",
161 "Subtract Value",
162 "Stall",
163 "Stall While True",
164 "Skip Next If True",
165 "GoTo",
166 "Set Source Address",
167 "Set Destination Address",
168 "Move Data",
169 "Unknown Instruction"
170 };
171
172 static const char *AcpiDmGtdtSubnames[] =
173 {
174 "Generic Timer Block",
175 "Generic Watchdog Timer",
176 "Unknown Subtable Type" /* Reserved */
177 };
178
179 static const char *AcpiDmHestSubnames[] =
180 {
181 "IA-32 Machine Check Exception",
182 "IA-32 Corrected Machine Check",
183 "IA-32 Non-Maskable Interrupt",
184 "Unknown Subtable Type", /* 3 - Reserved */
185 "Unknown Subtable Type", /* 4 - Reserved */
186 "Unknown Subtable Type", /* 5 - Reserved */
187 "PCI Express Root Port AER",
188 "PCI Express AER (AER Endpoint)",
189 "PCI Express/PCI-X Bridge AER",
190 "Generic Hardware Error Source",
191 "Generic Hardware Error Source V2",
192 "IA-32 Deferred Machine Check",
193 "Unknown Subtable Type" /* Reserved */
194 };
195
196 static const char *AcpiDmHestNotifySubnames[] =
197 {
198 "Polled",
199 "External Interrupt",
200 "Local Interrupt",
201 "SCI",
202 "NMI",
203 "CMCI", /* ACPI 5.0 */
204 "MCE", /* ACPI 5.0 */
205 "GPIO", /* ACPI 6.0 */
206 "SEA", /* ACPI 6.1 */
207 "SEI", /* ACPI 6.1 */
208 "GSIV", /* ACPI 6.1 */
209 "Software Delegated Exception", /* ACPI 6.2 */
210 "Unknown Notify Type" /* Reserved */
211 };
212
213 static const char *AcpiDmHmatSubnames[] =
214 {
215 "Memory Proximity Domain Attributes",
216 "System Locality Latency and Bandwidth Information",
217 "Memory Side Cache Information",
218 "Unknown Structure Type" /* Reserved */
219 };
220
221 static const char *AcpiDmMadtSubnames[] =
222 {
223 "Processor Local APIC", /* ACPI_MADT_TYPE_LOCAL_APIC */
224 "I/O APIC", /* ACPI_MADT_TYPE_IO_APIC */
225 "Interrupt Source Override", /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */
226 "NMI Source", /* ACPI_MADT_TYPE_NMI_SOURCE */
227 "Local APIC NMI", /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */
228 "Local APIC Address Override", /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */
229 "I/O SAPIC", /* ACPI_MADT_TYPE_IO_SAPIC */
230 "Local SAPIC", /* ACPI_MADT_TYPE_LOCAL_SAPIC */
231 "Platform Interrupt Sources", /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */
232 "Processor Local x2APIC", /* ACPI_MADT_TYPE_LOCAL_X2APIC */
233 "Local x2APIC NMI", /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */
234 "Generic Interrupt Controller", /* ACPI_MADT_GENERIC_INTERRUPT */
235 "Generic Interrupt Distributor", /* ACPI_MADT_GENERIC_DISTRIBUTOR */
236 "Generic MSI Frame", /* ACPI_MADT_GENERIC_MSI_FRAME */
237 "Generic Interrupt Redistributor", /* ACPI_MADT_GENERIC_REDISTRIBUTOR */
238 "Generic Interrupt Translator", /* ACPI_MADT_GENERIC_TRANSLATOR */
239 "Unknown Subtable Type" /* Reserved */
240 };
241
242 static const char *AcpiDmNfitSubnames[] =
243 {
244 "System Physical Address Range", /* ACPI_NFIT_TYPE_SYSTEM_ADDRESS */
245 "Memory Range Map", /* ACPI_NFIT_TYPE_MEMORY_MAP */
246 "Interleave Info", /* ACPI_NFIT_TYPE_INTERLEAVE */
247 "SMBIOS Information", /* ACPI_NFIT_TYPE_SMBIOS */
248 "NVDIMM Control Region", /* ACPI_NFIT_TYPE_CONTROL_REGION */
249 "NVDIMM Block Data Window Region", /* ACPI_NFIT_TYPE_DATA_REGION */
250 "Flush Hint Address", /* ACPI_NFIT_TYPE_FLUSH_ADDRESS */
251 "Platform Capabilities", /* ACPI_NFIT_TYPE_CAPABILITIES */
252 "Unknown Subtable Type" /* Reserved */
253 };
254
255 static const char *AcpiDmPcctSubnames[] =
256 {
257 "Generic Communications Subspace", /* ACPI_PCCT_TYPE_GENERIC_SUBSPACE */
258 "HW-Reduced Comm Subspace", /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE */
259 "HW-Reduced Comm Subspace Type2", /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 */
260 "Extended PCC Master Subspace", /* ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE */
261 "Extended PCC Slave Subspace", /* ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE */
262 "Unknown Subtable Type" /* Reserved */
263 };
264
265 static const char *AcpiDmPmttSubnames[] =
266 {
267 "Socket", /* ACPI_PMTT_TYPE_SOCKET */
268 "Memory Controller", /* ACPI_PMTT_TYPE_CONTROLLER */
269 "Physical Component (DIMM)", /* ACPI_PMTT_TYPE_DIMM */
270 "Unknown Subtable Type" /* Reserved */
271 };
272
273 static const char *AcpiDmPpttSubnames[] =
274 {
275 "Processor Hierarchy Node", /* ACPI_PPTT_TYPE_PROCESSOR */
276 "Cache Type", /* ACPI_PPTT_TYPE_CACHE */
277 "ID", /* ACPI_PPTT_TYPE_ID */
278 "Unknown Subtable Type" /* Reserved */
279 };
280
281 static const char *AcpiDmSdevSubnames[] =
282 {
283 "Namespace Device", /* ACPI_SDEV_TYPE_NAMESPACE_DEVICE */
284 "PCIe Endpoint Device", /* ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE */
285 "Unknown Subtable Type" /* Reserved */
286 };
287
288 static const char *AcpiDmSratSubnames[] =
289 {
290 "Processor Local APIC/SAPIC Affinity",
291 "Memory Affinity",
292 "Processor Local x2APIC Affinity",
293 "GICC Affinity",
294 "GIC ITS Affinity", /* Acpi 6.2 */
295 "Generic Initiator Affinity", /* Acpi 6.3 */
296 "Unknown Subtable Type" /* Reserved */
297 };
298
299 static const char *AcpiDmTpm2Subnames[] =
300 {
301 "Illegal Start Method value",
302 "Reserved",
303 "ACPI Start Method",
304 "Reserved",
305 "Reserved",
306 "Reserved",
307 "Memory Mapped I/O",
308 "Command Response Buffer",
309 "Command Response Buffer with ACPI Start Method",
310 "Reserved",
311 "Reserved",
312 "Command Response Buffer with ARM SMC",
313 "Unknown Subtable Type" /* Reserved */
314 };
315
316 static const char *AcpiDmIvrsSubnames[] =
317 {
318 "Hardware Definition Block",
319 "Memory Definition Block",
320 "Unknown Subtable Type" /* Reserved */
321 };
322
323 static const char *AcpiDmLpitSubnames[] =
324 {
325 "Native C-state Idle Structure",
326 "Unknown Subtable Type" /* Reserved */
327 };
328
329 #define ACPI_FADT_PM_RESERVED 9
330
331 static const char *AcpiDmFadtProfiles[] =
332 {
333 "Unspecified",
334 "Desktop",
335 "Mobile",
336 "Workstation",
337 "Enterprise Server",
338 "SOHO Server",
339 "Appliance PC",
340 "Performance Server",
341 "Tablet",
342 "Unknown Profile Type"
343 };
344
345 #define ACPI_GAS_WIDTH_RESERVED 5
346
347 static const char *AcpiDmGasAccessWidth[] =
348 {
349 "Undefined/Legacy",
350 "Byte Access:8",
351 "Word Access:16",
352 "DWord Access:32",
353 "QWord Access:64",
354 "Unknown Width Encoding"
355 };
356
357
358 /*******************************************************************************
359 *
360 * ACPI Table Data, indexed by signature.
361 *
362 * Each entry contains: Signature, Table Info, Handler, DtHandler,
363 * Template, Description
364 *
365 * Simple tables have only a TableInfo structure, complex tables have a
366 * handler. This table must be NULL terminated. RSDP and FACS are
367 * special-cased elsewhere.
368 *
369 * Note: Any tables added here should be duplicated within AcpiSupportedTables
370 * in the file common/ahtable.c
371 *
372 ******************************************************************************/
373
374 const ACPI_DMTABLE_DATA AcpiDmTableData[] =
375 {
376 {ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, DtCompileAsf, TemplateAsf},
377 {ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert},
378 {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt, NULL, NULL, TemplateBgrt},
379 {ACPI_SIG_BOOT, AcpiDmTableInfoBoot, NULL, NULL, TemplateBoot},
380 {ACPI_SIG_CPEP, NULL, AcpiDmDumpCpep, DtCompileCpep, TemplateCpep},
381 {ACPI_SIG_CSRT, NULL, AcpiDmDumpCsrt, DtCompileCsrt, TemplateCsrt},
382 {ACPI_SIG_DBG2, AcpiDmTableInfoDbg2, AcpiDmDumpDbg2, DtCompileDbg2, TemplateDbg2},
383 {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp, NULL, NULL, TemplateDbgp},
384 {ACPI_SIG_DMAR, NULL, AcpiDmDumpDmar, DtCompileDmar, TemplateDmar},
385 {ACPI_SIG_DRTM, NULL, AcpiDmDumpDrtm, DtCompileDrtm, TemplateDrtm},
386 {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt, NULL, NULL, TemplateEcdt},
387 {ACPI_SIG_EINJ, NULL, AcpiDmDumpEinj, DtCompileEinj, TemplateEinj},
388 {ACPI_SIG_ERST, NULL, AcpiDmDumpErst, DtCompileErst, TemplateErst},
389 {ACPI_SIG_FADT, NULL, AcpiDmDumpFadt, DtCompileFadt, TemplateFadt},
390 {ACPI_SIG_FPDT, NULL, AcpiDmDumpFpdt, DtCompileFpdt, TemplateFpdt},
391 {ACPI_SIG_GTDT, NULL, AcpiDmDumpGtdt, DtCompileGtdt, TemplateGtdt},
392 {ACPI_SIG_HEST, NULL, AcpiDmDumpHest, DtCompileHest, TemplateHest},
393 {ACPI_SIG_HMAT, NULL, AcpiDmDumpHmat, DtCompileHmat, TemplateHmat},
394 {ACPI_SIG_HPET, AcpiDmTableInfoHpet, NULL, NULL, TemplateHpet},
395 {ACPI_SIG_IORT, NULL, AcpiDmDumpIort, DtCompileIort, TemplateIort},
396 {ACPI_SIG_IVRS, NULL, AcpiDmDumpIvrs, DtCompileIvrs, TemplateIvrs},
397 {ACPI_SIG_LPIT, NULL, AcpiDmDumpLpit, DtCompileLpit, TemplateLpit},
398 {ACPI_SIG_MADT, NULL, AcpiDmDumpMadt, DtCompileMadt, TemplateMadt},
399 {ACPI_SIG_MCFG, NULL, AcpiDmDumpMcfg, DtCompileMcfg, TemplateMcfg},
400 {ACPI_SIG_MCHI, AcpiDmTableInfoMchi, NULL, NULL, TemplateMchi},
401 {ACPI_SIG_MPST, AcpiDmTableInfoMpst, AcpiDmDumpMpst, DtCompileMpst, TemplateMpst},
402 {ACPI_SIG_MSCT, NULL, AcpiDmDumpMsct, DtCompileMsct, TemplateMsct},
403 {ACPI_SIG_MSDM, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateMsdm},
404 {ACPI_SIG_MTMR, NULL, AcpiDmDumpMtmr, DtCompileMtmr, TemplateMtmr},
405 {ACPI_SIG_NFIT, AcpiDmTableInfoNfit, AcpiDmDumpNfit, DtCompileNfit, TemplateNfit},
406 {ACPI_SIG_PCCT, AcpiDmTableInfoPcct, AcpiDmDumpPcct, DtCompilePcct, TemplatePcct},
407 {ACPI_SIG_PDTT, AcpiDmTableInfoPdtt, AcpiDmDumpPdtt, DtCompilePdtt, TemplatePdtt},
408 {ACPI_SIG_PMTT, NULL, AcpiDmDumpPmtt, DtCompilePmtt, TemplatePmtt},
409 {ACPI_SIG_PPTT, NULL, AcpiDmDumpPptt, DtCompilePptt, TemplatePptt},
410 {ACPI_SIG_RASF, AcpiDmTableInfoRasf, NULL, NULL, TemplateRasf},
411 {ACPI_SIG_RSDT, NULL, AcpiDmDumpRsdt, DtCompileRsdt, TemplateRsdt},
412 {ACPI_SIG_S3PT, NULL, NULL, NULL, TemplateS3pt},
413 {ACPI_SIG_SBST, AcpiDmTableInfoSbst, NULL, NULL, TemplateSbst},
414 {ACPI_SIG_SDEI, AcpiDmTableInfoSdei, NULL, NULL, TemplateSdei},
415 {ACPI_SIG_SDEV, AcpiDmTableInfoSdev, AcpiDmDumpSdev, DtCompileSdev, TemplateSdev},
416 {ACPI_SIG_SLIC, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateSlic},
417 {ACPI_SIG_SLIT, NULL, AcpiDmDumpSlit, DtCompileSlit, TemplateSlit},
418 {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr, NULL, NULL, TemplateSpcr},
419 {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi, NULL, NULL, TemplateSpmi},
420 {ACPI_SIG_SRAT, NULL, AcpiDmDumpSrat, DtCompileSrat, TemplateSrat},
421 {ACPI_SIG_STAO, NULL, AcpiDmDumpStao, DtCompileStao, TemplateStao},
422 {ACPI_SIG_TCPA, NULL, AcpiDmDumpTcpa, DtCompileTcpa, TemplateTcpa},
423 {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2, AcpiDmDumpTpm2, DtCompileTpm2, TemplateTpm2},
424 {ACPI_SIG_UEFI, AcpiDmTableInfoUefi, NULL, DtCompileUefi, TemplateUefi},
425 {ACPI_SIG_VRTC, AcpiDmTableInfoVrtc, AcpiDmDumpVrtc, DtCompileVrtc, TemplateVrtc},
426 {ACPI_SIG_WAET, AcpiDmTableInfoWaet, NULL, NULL, TemplateWaet},
427 {ACPI_SIG_WDAT, NULL, AcpiDmDumpWdat, DtCompileWdat, TemplateWdat},
428 {ACPI_SIG_WDDT, AcpiDmTableInfoWddt, NULL, NULL, TemplateWddt},
429 {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt, NULL, NULL, TemplateWdrt},
430 {ACPI_SIG_WPBT, NULL, AcpiDmDumpWpbt, DtCompileWpbt, TemplateWpbt},
431 {ACPI_SIG_WSMT, AcpiDmTableInfoWsmt, NULL, NULL, TemplateWsmt},
432 {ACPI_SIG_XENV, AcpiDmTableInfoXenv, NULL, NULL, TemplateXenv},
433 {ACPI_SIG_XSDT, NULL, AcpiDmDumpXsdt, DtCompileXsdt, TemplateXsdt},
434 {NULL, NULL, NULL, NULL, NULL}
435 };
436
437
438 /*******************************************************************************
439 *
440 * FUNCTION: AcpiDmGenerateChecksum
441 *
442 * PARAMETERS: Table - Pointer to table to be checksummed
443 * Length - Length of the table
444 * OriginalChecksum - Value of the checksum field
445 *
446 * RETURN: 8 bit checksum of buffer
447 *
448 * DESCRIPTION: Computes an 8 bit checksum of the table.
449 *
450 ******************************************************************************/
451
452 UINT8
453 AcpiDmGenerateChecksum (
454 void *Table,
455 UINT32 Length,
456 UINT8 OriginalChecksum)
457 {
458 UINT8 Checksum;
459
460
461 /* Sum the entire table as-is */
462
463 Checksum = AcpiTbChecksum ((UINT8 *) Table, Length);
464
465 /* Subtract off the existing checksum value in the table */
466
467 Checksum = (UINT8) (Checksum - OriginalChecksum);
468
469 /* Compute the final checksum */
470
471 Checksum = (UINT8) (0 - Checksum);
472 return (Checksum);
473 }
474
475
476 /*******************************************************************************
477 *
478 * FUNCTION: AcpiDmGetTableData
479 *
480 * PARAMETERS: Signature - ACPI signature (4 chars) to match
481 *
482 * RETURN: Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found.
483 *
484 * DESCRIPTION: Find a match in the global table of supported ACPI tables
485 *
486 ******************************************************************************/
487
488 const ACPI_DMTABLE_DATA *
489 AcpiDmGetTableData (
490 char *Signature)
491 {
492 const ACPI_DMTABLE_DATA *Info;
493
494
495 for (Info = AcpiDmTableData; Info->Signature; Info++)
496 {
497 if (ACPI_COMPARE_NAMESEG (Signature, Info->Signature))
498 {
499 return (Info);
500 }
501 }
502
503 return (NULL);
504 }
505
506
507 /*******************************************************************************
508 *
509 * FUNCTION: AcpiDmDumpDataTable
510 *
511 * PARAMETERS: Table - An ACPI table
512 *
513 * RETURN: None.
514 *
515 * DESCRIPTION: Format the contents of an ACPI data table (any table other
516 * than an SSDT or DSDT that does not contain executable AML code)
517 *
518 ******************************************************************************/
519
520 void
521 AcpiDmDumpDataTable (
522 ACPI_TABLE_HEADER *Table)
523 {
524 ACPI_STATUS Status;
525 const ACPI_DMTABLE_DATA *TableData;
526 UINT32 Length;
527
528
529 /* Ignore tables that contain AML */
530
531 if (AcpiUtIsAmlTable (Table))
532 {
533 if (AslGbl_VerboseTemplates)
534 {
535 /* Dump the raw table data */
536
537 Length = Table->Length;
538
539 AcpiOsPrintf ("\n/*\n%s: Length %d (0x%X)\n\n",
540 ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
541 AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
542 Length, DB_BYTE_DISPLAY, 0);
543 AcpiOsPrintf (" */\n");
544 }
545 return;
546 }
547
548 /*
549 * Handle tables that don't use the common ACPI table header structure.
550 * Currently, these are the FACS, RSDP, and S3PT.
551 */
552 if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_FACS))
553 {
554 Length = Table->Length;
555 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs);
556 if (ACPI_FAILURE (Status))
557 {
558 return;
559 }
560 }
561 else if (ACPI_VALIDATE_RSDP_SIG (Table->Signature))
562 {
563 Length = AcpiDmDumpRsdp (Table);
564 }
565 else if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_S3PT))
566 {
567 Length = AcpiDmDumpS3pt (Table);
568 }
569 else
570 {
571 /*
572 * All other tables must use the common ACPI table header, dump it now
573 */
574 Length = Table->Length;
575 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader);
576 if (ACPI_FAILURE (Status))
577 {
578 return;
579 }
580 AcpiOsPrintf ("\n");
581
582 /* Match signature and dispatch appropriately */
583
584 TableData = AcpiDmGetTableData (Table->Signature);
585 if (!TableData)
586 {
587 if (!strncmp (Table->Signature, "OEM", 3))
588 {
589 AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n",
590 Table->Signature);
591 }
592 else
593 {
594 AcpiOsPrintf ("\n**** Unknown ACPI table signature [%4.4s]\n\n",
595 Table->Signature);
596
597 fprintf (stderr, "Unknown ACPI table signature [%4.4s], ",
598 Table->Signature);
599
600 if (!AcpiGbl_ForceAmlDisassembly)
601 {
602 fprintf (stderr, "decoding ACPI table header only\n");
603 }
604 else
605 {
606 fprintf (stderr, "assuming table contains valid AML code\n");
607 }
608 }
609 }
610 else if (TableData->TableHandler)
611 {
612 /* Complex table, has a handler */
613
614 TableData->TableHandler (Table);
615 }
616 else if (TableData->TableInfo)
617 {
618 /* Simple table, just walk the info table */
619
620 Status = AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo);
621 if (ACPI_FAILURE (Status))
622 {
623 return;
624 }
625 }
626 }
627
628 if (!AslGbl_DoTemplates || AslGbl_VerboseTemplates)
629 {
630 /* Dump the raw table data */
631
632 AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n",
633 ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
634 AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
635 Length, DB_BYTE_DISPLAY, 0);
636 }
637 }
638
639
640 /*******************************************************************************
641 *
642 * FUNCTION: AcpiDmLineHeader
643 *
644 * PARAMETERS: Offset - Current byte offset, from table start
645 * ByteLength - Length of the field in bytes, 0 for flags
646 * Name - Name of this field
647 *
648 * RETURN: None
649 *
650 * DESCRIPTION: Utility routines for formatting output lines. Displays the
651 * current table offset in hex and decimal, the field length,
652 * and the field name.
653 *
654 ******************************************************************************/
655
656 void
657 AcpiDmLineHeader (
658 UINT32 Offset,
659 UINT32 ByteLength,
660 char *Name)
661 {
662
663 /* Allow a null name for fields that span multiple lines (large buffers) */
664
665 if (!Name)
666 {
667 Name = "";
668 }
669
670 if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */
671 {
672 if (ByteLength)
673 {
674 AcpiOsPrintf ("[%.4d] %34s : ", ByteLength, Name);
675 }
676 else
677 {
678 if (*Name)
679 {
680 AcpiOsPrintf ("%41s : ", Name);
681 }
682 else
683 {
684 AcpiOsPrintf ("%41s ", Name);
685 }
686 }
687 }
688 else /* Normal disassembler or verbose template */
689 {
690 if (ByteLength)
691 {
692 AcpiOsPrintf ("[%3.3Xh %4.4d% 4d] %28s : ",
693 Offset, Offset, ByteLength, Name);
694 }
695 else
696 {
697 if (*Name)
698 {
699 AcpiOsPrintf ("%44s : ", Name);
700 }
701 else
702 {
703 AcpiOsPrintf ("%44s ", Name);
704 }
705 }
706 }
707 }
708
709 void
710 AcpiDmLineHeader2 (
711 UINT32 Offset,
712 UINT32 ByteLength,
713 char *Name,
714 UINT32 Value)
715 {
716
717 if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */
718 {
719 if (ByteLength)
720 {
721 AcpiOsPrintf ("[%.4d] %30s %3d : ",
722 ByteLength, Name, Value);
723 }
724 else
725 {
726 AcpiOsPrintf ("%36s % 3d : ",
727 Name, Value);
728 }
729 }
730 else /* Normal disassembler or verbose template */
731 {
732 if (ByteLength)
733 {
734 AcpiOsPrintf ("[%3.3Xh %4.4d %3d] %24s %3d : ",
735 Offset, Offset, ByteLength, Name, Value);
736 }
737 else
738 {
739 AcpiOsPrintf ("[%3.3Xh %4.4d ] %24s %3d : ",
740 Offset, Offset, Name, Value);
741 }
742 }
743 }
744
745
746 /*******************************************************************************
747 *
748 * FUNCTION: AcpiDmDumpTable
749 *
750 * PARAMETERS: TableLength - Length of the entire ACPI table
751 * TableOffset - Starting offset within the table for this
752 * sub-descriptor (0 if main table)
753 * Table - The ACPI table
754 * SubtableLength - Length of this sub-descriptor
755 * Info - Info table for this ACPI table
756 *
757 * RETURN: Status
758 *
759 * DESCRIPTION: Display ACPI table contents by walking the Info table.
760 *
761 * Note: This function must remain in sync with DtGetFieldLength.
762 *
763 ******************************************************************************/
764
765 ACPI_STATUS
766 AcpiDmDumpTable (
767 UINT32 TableLength,
768 UINT32 TableOffset,
769 void *Table,
770 UINT32 SubtableLength,
771 ACPI_DMTABLE_INFO *Info)
772 {
773 UINT8 *Target;
774 UINT32 CurrentOffset;
775 UINT32 ByteLength;
776 UINT8 Temp8;
777 UINT16 Temp16;
778 UINT32 Temp32;
779 UINT64 Value;
780 const AH_TABLE *TableData;
781 const char *Name;
782 BOOLEAN LastOutputBlankLine = FALSE;
783 ACPI_STATUS Status;
784 char RepairedName[8];
785
786
787 if (!Info)
788 {
789 AcpiOsPrintf ("Display not implemented\n");
790 return (AE_NOT_IMPLEMENTED);
791 }
792
793 /* Walk entire Info table; Null name terminates */
794
795 for (; Info->Name; Info++)
796 {
797 /*
798 * Target points to the field within the ACPI Table. CurrentOffset is
799 * the offset of the field from the start of the main table.
800 */
801 Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset);
802 CurrentOffset = TableOffset + Info->Offset;
803
804 /* Check for beyond subtable end or (worse) beyond EOT */
805
806 if (SubtableLength && (Info->Offset >= SubtableLength))
807 {
808 AcpiOsPrintf (
809 "/**** ACPI subtable terminates early - "
810 "may be older version (dump table) */\n");
811
812 /* Move on to next subtable */
813
814 return (AE_OK);
815 }
816
817 if (CurrentOffset >= TableLength)
818 {
819 AcpiOsPrintf (
820 "/**** ACPI table terminates "
821 "in the middle of a data structure! (dump table) */\n");
822 return (AE_BAD_DATA);
823 }
824
825 /* Generate the byte length for this field */
826
827 switch (Info->Opcode)
828 {
829 case ACPI_DMT_UINT8:
830 case ACPI_DMT_CHKSUM:
831 case ACPI_DMT_SPACEID:
832 case ACPI_DMT_ACCWIDTH:
833 case ACPI_DMT_IVRS:
834 case ACPI_DMT_GTDT:
835 case ACPI_DMT_MADT:
836 case ACPI_DMT_PCCT:
837 case ACPI_DMT_PMTT:
838 case ACPI_DMT_PPTT:
839 case ACPI_DMT_SDEV:
840 case ACPI_DMT_SRAT:
841 case ACPI_DMT_ASF:
842 case ACPI_DMT_HESTNTYP:
843 case ACPI_DMT_FADTPM:
844 case ACPI_DMT_EINJACT:
845 case ACPI_DMT_EINJINST:
846 case ACPI_DMT_ERSTACT:
847 case ACPI_DMT_ERSTINST:
848 case ACPI_DMT_DMAR_SCOPE:
849
850 ByteLength = 1;
851 break;
852
853 case ACPI_DMT_UINT16:
854 case ACPI_DMT_DMAR:
855 case ACPI_DMT_HEST:
856 case ACPI_DMT_HMAT:
857 case ACPI_DMT_NFIT:
858
859 ByteLength = 2;
860 break;
861
862 case ACPI_DMT_UINT24:
863
864 ByteLength = 3;
865 break;
866
867 case ACPI_DMT_UINT32:
868 case ACPI_DMT_NAME4:
869 case ACPI_DMT_SIG:
870 case ACPI_DMT_LPIT:
871 case ACPI_DMT_TPM2:
872
873 ByteLength = 4;
874 break;
875
876 case ACPI_DMT_UINT40:
877
878 ByteLength = 5;
879 break;
880
881 case ACPI_DMT_UINT48:
882 case ACPI_DMT_NAME6:
883
884 ByteLength = 6;
885 break;
886
887 case ACPI_DMT_UINT56:
888 case ACPI_DMT_BUF7:
889
890 ByteLength = 7;
891 break;
892
893 case ACPI_DMT_UINT64:
894 case ACPI_DMT_NAME8:
895
896 ByteLength = 8;
897 break;
898
899 case ACPI_DMT_BUF10:
900
901 ByteLength = 10;
902 break;
903
904 case ACPI_DMT_BUF12:
905
906 ByteLength = 12;
907 break;
908
909 case ACPI_DMT_BUF16:
910 case ACPI_DMT_UUID:
911
912 ByteLength = 16;
913 break;
914
915 case ACPI_DMT_BUF128:
916
917 ByteLength = 128;
918 break;
919
920 case ACPI_DMT_UNICODE:
921 case ACPI_DMT_BUFFER:
922 case ACPI_DMT_RAW_BUFFER:
923
924 ByteLength = SubtableLength;
925 break;
926
927 case ACPI_DMT_STRING:
928
929 ByteLength = strlen (ACPI_CAST_PTR (char, Target)) + 1;
930 break;
931
932 case ACPI_DMT_GAS:
933
934 if (!LastOutputBlankLine)
935 {
936 AcpiOsPrintf ("\n");
937 LastOutputBlankLine = TRUE;
938 }
939
940 ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
941 break;
942
943 case ACPI_DMT_HESTNTFY:
944
945 if (!LastOutputBlankLine)
946 {
947 AcpiOsPrintf ("\n");
948 LastOutputBlankLine = TRUE;
949 }
950
951 ByteLength = sizeof (ACPI_HEST_NOTIFY);
952 break;
953
954 case ACPI_DMT_IORTMEM:
955
956 if (!LastOutputBlankLine)
957 {
958 LastOutputBlankLine = FALSE;
959 }
960
961 ByteLength = sizeof (ACPI_IORT_MEMORY_ACCESS);
962 break;
963
964 default:
965
966 ByteLength = 0;
967 break;
968 }
969
970 /* Check if we are beyond a subtable, or (worse) beyond EOT */
971
972 if (CurrentOffset + ByteLength > TableLength)
973 {
974 if (SubtableLength)
975 {
976 AcpiOsPrintf (
977 "/**** ACPI subtable terminates early - "
978 "may be older version (dump table) */\n");
979
980 /* Move on to next subtable */
981
982 return (AE_OK);
983 }
984
985 AcpiOsPrintf (
986 "/**** ACPI table terminates "
987 "in the middle of a data structure! */\n");
988 return (AE_BAD_DATA);
989 }
990
991 if (Info->Opcode == ACPI_DMT_EXTRA_TEXT)
992 {
993 AcpiOsPrintf ("%s", Info->Name);
994 continue;
995 }
996
997 /* Start a new line and decode the opcode */
998
999 AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name);
1000
1001 switch (Info->Opcode)
1002 {
1003 /* Single-bit Flag fields. Note: Opcode is the bit position */
1004
1005 case ACPI_DMT_FLAG0:
1006 case ACPI_DMT_FLAG1:
1007 case ACPI_DMT_FLAG2:
1008 case ACPI_DMT_FLAG3:
1009 case ACPI_DMT_FLAG4:
1010 case ACPI_DMT_FLAG5:
1011 case ACPI_DMT_FLAG6:
1012 case ACPI_DMT_FLAG7:
1013
1014 AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01);
1015 break;
1016
1017 /* 2-bit Flag fields */
1018
1019 case ACPI_DMT_FLAGS0:
1020
1021 AcpiOsPrintf ("%1.1X\n", *Target & 0x03);
1022 break;
1023
1024 case ACPI_DMT_FLAGS1:
1025
1026 AcpiOsPrintf ("%1.1X\n", (*Target >> 1) & 0x03);
1027 break;
1028
1029 case ACPI_DMT_FLAGS2:
1030
1031 AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03);
1032 break;
1033
1034 case ACPI_DMT_FLAGS4:
1035
1036 AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03);
1037 break;
1038
1039 case ACPI_DMT_FLAGS4_0:
1040
1041 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target) & 0x0F);
1042 break;
1043
1044 case ACPI_DMT_FLAGS4_4:
1045
1046 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 4) & 0x0F);
1047 break;
1048
1049 case ACPI_DMT_FLAGS4_8:
1050
1051 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 8) & 0x0F);
1052 break;
1053
1054 case ACPI_DMT_FLAGS4_12:
1055
1056 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 12) & 0x0F);
1057 break;
1058
1059 case ACPI_DMT_FLAGS16_16:
1060
1061 AcpiOsPrintf ("%4.4X\n", (*(UINT32 *)Target >> 16) & 0xFFFF);
1062 break;
1063
1064 /* Integer Data Types */
1065
1066 case ACPI_DMT_UINT8:
1067 case ACPI_DMT_UINT16:
1068 case ACPI_DMT_UINT24:
1069 case ACPI_DMT_UINT32:
1070 case ACPI_DMT_UINT40:
1071 case ACPI_DMT_UINT48:
1072 case ACPI_DMT_UINT56:
1073 case ACPI_DMT_UINT64:
1074 /*
1075 * Dump bytes - high byte first, low byte last.
1076 * Note: All ACPI tables are little-endian.
1077 */
1078 Value = 0;
1079 for (Temp8 = (UINT8) ByteLength; Temp8 > 0; Temp8--)
1080 {
1081 AcpiOsPrintf ("%2.2X", Target[Temp8 - 1]);
1082 Value |= Target[Temp8 - 1];
1083 Value <<= 8;
1084 }
1085
1086 if (!Value && (Info->Flags & DT_DESCRIBES_OPTIONAL))
1087 {
1088 AcpiOsPrintf (" [Optional field not present]");
1089 }
1090
1091 AcpiOsPrintf ("\n");
1092 break;
1093
1094 case ACPI_DMT_BUF7:
1095 case ACPI_DMT_BUF10:
1096 case ACPI_DMT_BUF12:
1097 case ACPI_DMT_BUF16:
1098 case ACPI_DMT_BUF128:
1099 /*
1100 * Buffer: Size depends on the opcode and was set above.
1101 * Each hex byte is separated with a space.
1102 * Multiple lines are separated by line continuation char.
1103 */
1104 for (Temp16 = 0; Temp16 < ByteLength; Temp16++)
1105 {
1106 AcpiOsPrintf ("%2.2X", Target[Temp16]);
1107 if ((UINT32) (Temp16 + 1) < ByteLength)
1108 {
1109 if ((Temp16 > 0) && (!((Temp16+1) % 16)))
1110 {
1111 AcpiOsPrintf (" \\\n"); /* Line continuation */
1112 AcpiDmLineHeader (0, 0, NULL);
1113 }
1114 else
1115 {
1116 AcpiOsPrintf (" ");
1117 }
1118 }
1119 }
1120
1121 AcpiOsPrintf ("\n");
1122 break;
1123
1124 case ACPI_DMT_UUID:
1125
1126 /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */
1127
1128 (void) AuConvertUuidToString ((char *) Target, AslGbl_MsgBuffer);
1129
1130 AcpiOsPrintf ("%s\n", AslGbl_MsgBuffer);
1131 break;
1132
1133 case ACPI_DMT_STRING:
1134
1135 AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target));
1136 break;
1137
1138 /* Fixed length ASCII name fields */
1139
1140 case ACPI_DMT_SIG:
1141
1142 AcpiUtCheckAndRepairAscii (Target, RepairedName, 4);
1143 AcpiOsPrintf ("\"%.4s\" ", RepairedName);
1144
1145 TableData = AcpiAhGetTableInfo (ACPI_CAST_PTR (char, Target));
1146 if (TableData)
1147 {
1148 AcpiOsPrintf (STRING_FORMAT, TableData->Description);
1149 }
1150 else
1151 {
1152 AcpiOsPrintf ("\n");
1153 }
1154 break;
1155
1156 case ACPI_DMT_NAME4:
1157
1158 AcpiUtCheckAndRepairAscii (Target, RepairedName, 4);
1159 AcpiOsPrintf ("\"%.4s\"\n", RepairedName);
1160 break;
1161
1162 case ACPI_DMT_NAME6:
1163
1164 AcpiUtCheckAndRepairAscii (Target, RepairedName, 6);
1165 AcpiOsPrintf ("\"%.6s\"\n", RepairedName);
1166 break;
1167
1168 case ACPI_DMT_NAME8:
1169
1170 AcpiUtCheckAndRepairAscii (Target, RepairedName, 8);
1171 AcpiOsPrintf ("\"%.8s\"\n", RepairedName);
1172 break;
1173
1174 /* Special Data Types */
1175
1176 case ACPI_DMT_CHKSUM:
1177
1178 /* Checksum, display and validate */
1179
1180 AcpiOsPrintf ("%2.2X", *Target);
1181 Temp8 = AcpiDmGenerateChecksum (Table,
1182 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
1183 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum);
1184
1185 if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
1186 {
1187 AcpiOsPrintf (
1188 " /* Incorrect checksum, should be %2.2X */", Temp8);
1189 }
1190
1191 AcpiOsPrintf ("\n");
1192 break;
1193
1194 case ACPI_DMT_SPACEID:
1195
1196 /* Address Space ID */
1197
1198 AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target));
1199 break;
1200
1201 case ACPI_DMT_ACCWIDTH:
1202
1203 /* Encoded Access Width */
1204
1205 Temp8 = *Target;
1206 if (Temp8 > ACPI_GAS_WIDTH_RESERVED)
1207 {
1208 Temp8 = ACPI_GAS_WIDTH_RESERVED;
1209 }
1210
1211 AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmGasAccessWidth[Temp8]);
1212 break;
1213
1214 case ACPI_DMT_GAS:
1215
1216 /* Generic Address Structure */
1217
1218 AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure");
1219 Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1220 sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas);
1221 if (ACPI_FAILURE (Status))
1222 {
1223 return (Status);
1224 }
1225
1226 AcpiOsPrintf ("\n");
1227 LastOutputBlankLine = TRUE;
1228 break;
1229
1230 case ACPI_DMT_ASF:
1231
1232 /* ASF subtable types */
1233
1234 Temp16 = (UINT16) ((*Target) & 0x7F); /* Top bit can be zero or one */
1235 if (Temp16 > ACPI_ASF_TYPE_RESERVED)
1236 {
1237 Temp16 = ACPI_ASF_TYPE_RESERVED;
1238 }
1239
1240 AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]);
1241 break;
1242
1243 case ACPI_DMT_DMAR:
1244
1245 /* DMAR subtable types */
1246
1247 Temp16 = ACPI_GET16 (Target);
1248 if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
1249 {
1250 Temp16 = ACPI_DMAR_TYPE_RESERVED;
1251 }
1252
1253 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1254 AcpiDmDmarSubnames[Temp16]);
1255 break;
1256
1257 case ACPI_DMT_DMAR_SCOPE:
1258
1259 /* DMAR device scope types */
1260
1261 Temp8 = *Target;
1262 if (Temp8 > ACPI_DMAR_SCOPE_TYPE_RESERVED)
1263 {
1264 Temp8 = ACPI_DMAR_SCOPE_TYPE_RESERVED;
1265 }
1266
1267 AcpiOsPrintf (UINT8_FORMAT, *Target,
1268 AcpiDmDmarScope[Temp8]);
1269 break;
1270
1271 case ACPI_DMT_EINJACT:
1272
1273 /* EINJ Action types */
1274
1275 Temp8 = *Target;
1276 if (Temp8 > ACPI_EINJ_ACTION_RESERVED)
1277 {
1278 Temp8 = ACPI_EINJ_ACTION_RESERVED;
1279 }
1280
1281 AcpiOsPrintf (UINT8_FORMAT, *Target,
1282 AcpiDmEinjActions[Temp8]);
1283 break;
1284
1285 case ACPI_DMT_EINJINST:
1286
1287 /* EINJ Instruction types */
1288
1289 Temp8 = *Target;
1290 if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED)
1291 {
1292 Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED;
1293 }
1294
1295 AcpiOsPrintf (UINT8_FORMAT, *Target,
1296 AcpiDmEinjInstructions[Temp8]);
1297 break;
1298
1299 case ACPI_DMT_ERSTACT:
1300
1301 /* ERST Action types */
1302
1303 Temp8 = *Target;
1304 if (Temp8 > ACPI_ERST_ACTION_RESERVED)
1305 {
1306 Temp8 = ACPI_ERST_ACTION_RESERVED;
1307 }
1308
1309 AcpiOsPrintf (UINT8_FORMAT, *Target,
1310 AcpiDmErstActions[Temp8]);
1311 break;
1312
1313 case ACPI_DMT_ERSTINST:
1314
1315 /* ERST Instruction types */
1316
1317 Temp8 = *Target;
1318 if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED)
1319 {
1320 Temp8 = ACPI_ERST_INSTRUCTION_RESERVED;
1321 }
1322
1323 AcpiOsPrintf (UINT8_FORMAT, *Target,
1324 AcpiDmErstInstructions[Temp8]);
1325 break;
1326
1327 case ACPI_DMT_GTDT:
1328
1329 /* GTDT subtable types */
1330
1331 Temp8 = *Target;
1332 if (Temp8 > ACPI_GTDT_TYPE_RESERVED)
1333 {
1334 Temp8 = ACPI_GTDT_TYPE_RESERVED;
1335 }
1336
1337 AcpiOsPrintf (UINT8_FORMAT, *Target,
1338 AcpiDmGtdtSubnames[Temp8]);
1339 break;
1340
1341 case ACPI_DMT_HEST:
1342
1343 /* HEST subtable types */
1344
1345 Temp16 = ACPI_GET16 (Target);
1346 if (Temp16 > ACPI_HEST_TYPE_RESERVED)
1347 {
1348 Temp16 = ACPI_HEST_TYPE_RESERVED;
1349 }
1350
1351 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1352 AcpiDmHestSubnames[Temp16]);
1353 break;
1354
1355 case ACPI_DMT_HESTNTFY:
1356
1357 AcpiOsPrintf (STRING_FORMAT,
1358 "Hardware Error Notification Structure");
1359
1360 Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1361 sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify);
1362 if (ACPI_FAILURE (Status))
1363 {
1364 return (Status);
1365 }
1366
1367 AcpiOsPrintf ("\n");
1368 LastOutputBlankLine = TRUE;
1369 break;
1370
1371 case ACPI_DMT_HESTNTYP:
1372
1373 /* HEST Notify types */
1374
1375 Temp8 = *Target;
1376 if (Temp8 > ACPI_HEST_NOTIFY_RESERVED)
1377 {
1378 Temp8 = ACPI_HEST_NOTIFY_RESERVED;
1379 }
1380
1381 AcpiOsPrintf (UINT8_FORMAT, *Target,
1382 AcpiDmHestNotifySubnames[Temp8]);
1383 break;
1384
1385 case ACPI_DMT_HMAT:
1386
1387 /* HMAT subtable types */
1388
1389 Temp16 = *Target;
1390 if (Temp16 > ACPI_HMAT_TYPE_RESERVED)
1391 {
1392 Temp16 = ACPI_HMAT_TYPE_RESERVED;
1393 }
1394
1395 AcpiOsPrintf (UINT16_FORMAT, *Target,
1396 AcpiDmHmatSubnames[Temp16]);
1397 break;
1398
1399 case ACPI_DMT_IORTMEM:
1400
1401 AcpiOsPrintf (STRING_FORMAT,
1402 "IORT Memory Access Properties");
1403
1404 Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1405 sizeof (ACPI_IORT_MEMORY_ACCESS), AcpiDmTableInfoIortAcc);
1406 if (ACPI_FAILURE (Status))
1407 {
1408 return (Status);
1409 }
1410
1411 LastOutputBlankLine = TRUE;
1412 break;
1413
1414 case ACPI_DMT_MADT:
1415
1416 /* MADT subtable types */
1417
1418 Temp8 = *Target;
1419 if (Temp8 > ACPI_MADT_TYPE_RESERVED)
1420 {
1421 Temp8 = ACPI_MADT_TYPE_RESERVED;
1422 }
1423
1424 AcpiOsPrintf (UINT8_FORMAT, *Target,
1425 AcpiDmMadtSubnames[Temp8]);
1426 break;
1427
1428 case ACPI_DMT_NFIT:
1429
1430 /* NFIT subtable types */
1431
1432 Temp16 = ACPI_GET16 (Target);
1433 if (Temp16 > ACPI_NFIT_TYPE_RESERVED)
1434 {
1435 Temp16 = ACPI_NFIT_TYPE_RESERVED;
1436 }
1437
1438 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1439 AcpiDmNfitSubnames[Temp16]);
1440 break;
1441
1442 case ACPI_DMT_PCCT:
1443
1444 /* PCCT subtable types */
1445
1446 Temp8 = *Target;
1447 if (Temp8 > ACPI_PCCT_TYPE_RESERVED)
1448 {
1449 Temp8 = ACPI_PCCT_TYPE_RESERVED;
1450 }
1451
1452 AcpiOsPrintf (UINT8_FORMAT, *Target,
1453 AcpiDmPcctSubnames[Temp8]);
1454 break;
1455
1456 case ACPI_DMT_PMTT:
1457
1458 /* PMTT subtable types */
1459
1460 Temp8 = *Target;
1461 if (Temp8 > ACPI_PMTT_TYPE_RESERVED)
1462 {
1463 Temp8 = ACPI_PMTT_TYPE_RESERVED;
1464 }
1465
1466 AcpiOsPrintf (UINT8_FORMAT, *Target,
1467 AcpiDmPmttSubnames[Temp8]);
1468 break;
1469
1470 case ACPI_DMT_PPTT:
1471
1472 /* PPTT subtable types */
1473
1474 Temp8 = *Target;
1475 if (Temp8 > ACPI_PPTT_TYPE_RESERVED)
1476 {
1477 Temp8 = ACPI_PPTT_TYPE_RESERVED;
1478 }
1479
1480 AcpiOsPrintf (UINT8_FORMAT, *Target,
1481 AcpiDmPpttSubnames[Temp8]);
1482 break;
1483
1484 case ACPI_DMT_UNICODE:
1485
1486 if (ByteLength == 0)
1487 {
1488 AcpiOsPrintf ("/* Zero-length Data */\n");
1489 break;
1490 }
1491
1492 AcpiDmDumpUnicode (Table, CurrentOffset, ByteLength);
1493 break;
1494
1495 case ACPI_DMT_RAW_BUFFER:
1496
1497 if (ByteLength == 0)
1498 {
1499 AcpiOsPrintf ("/* Zero-length Data */\n");
1500 break;
1501 }
1502
1503 AcpiDmDumpBuffer (Table, CurrentOffset, ByteLength,
1504 CurrentOffset, NULL);
1505 break;
1506
1507 case ACPI_DMT_SDEV:
1508
1509 /* SDEV subtable types */
1510
1511 Temp8 = *Target;
1512 if (Temp8 > ACPI_SDEV_TYPE_RESERVED)
1513 {
1514 Temp8 = ACPI_SDEV_TYPE_RESERVED;
1515 }
1516
1517 AcpiOsPrintf (UINT8_FORMAT, *Target,
1518 AcpiDmSdevSubnames[Temp8]);
1519 break;
1520
1521 case ACPI_DMT_SRAT:
1522
1523 /* SRAT subtable types */
1524
1525 Temp8 = *Target;
1526 if (Temp8 > ACPI_SRAT_TYPE_RESERVED)
1527 {
1528 Temp8 = ACPI_SRAT_TYPE_RESERVED;
1529 }
1530
1531 AcpiOsPrintf (UINT8_FORMAT, *Target,
1532 AcpiDmSratSubnames[Temp8]);
1533 break;
1534
1535 case ACPI_DMT_TPM2:
1536
1537 /* TPM2 Start Method types */
1538
1539 Temp8 = *Target;
1540 if (Temp8 > ACPI_TPM2_RESERVED)
1541 {
1542 Temp8 = ACPI_TPM2_RESERVED;
1543 }
1544
1545 AcpiOsPrintf (UINT8_FORMAT, *Target,
1546 AcpiDmTpm2Subnames[Temp8]);
1547 break;
1548
1549
1550 case ACPI_DMT_FADTPM:
1551
1552 /* FADT Preferred PM Profile names */
1553
1554 Temp8 = *Target;
1555 if (Temp8 > ACPI_FADT_PM_RESERVED)
1556 {
1557 Temp8 = ACPI_FADT_PM_RESERVED;
1558 }
1559
1560 AcpiOsPrintf (UINT8_FORMAT, *Target,
1561 AcpiDmFadtProfiles[Temp8]);
1562 break;
1563
1564 case ACPI_DMT_IVRS:
1565
1566 /* IVRS subtable types */
1567
1568 Temp8 = *Target;
1569 switch (Temp8)
1570 {
1571 case ACPI_IVRS_TYPE_HARDWARE:
1572
1573 Name = AcpiDmIvrsSubnames[0];
1574 break;
1575
1576 case ACPI_IVRS_TYPE_MEMORY1:
1577 case ACPI_IVRS_TYPE_MEMORY2:
1578 case ACPI_IVRS_TYPE_MEMORY3:
1579
1580 Name = AcpiDmIvrsSubnames[1];
1581 break;
1582
1583 default:
1584
1585 Name = AcpiDmIvrsSubnames[2];
1586 break;
1587 }
1588
1589 AcpiOsPrintf (UINT8_FORMAT, *Target, Name);
1590 break;
1591
1592 case ACPI_DMT_LPIT:
1593
1594 /* LPIT subtable types */
1595
1596 Temp32 = ACPI_GET32 (Target);
1597 if (Temp32 > ACPI_LPIT_TYPE_RESERVED)
1598 {
1599 Temp32 = ACPI_LPIT_TYPE_RESERVED;
1600 }
1601
1602 AcpiOsPrintf (UINT32_FORMAT, ACPI_GET32 (Target),
1603 AcpiDmLpitSubnames[Temp32]);
1604 break;
1605
1606 case ACPI_DMT_EXIT:
1607
1608 return (AE_OK);
1609
1610 default:
1611
1612 ACPI_ERROR ((AE_INFO,
1613 "**** Invalid table opcode [0x%X] ****\n", Info->Opcode));
1614 return (AE_SUPPORT);
1615 }
1616 }
1617
1618 if (TableOffset && !SubtableLength)
1619 {
1620 /*
1621 * If this table is not the main table, the subtable must have a
1622 * valid length
1623 */
1624 AcpiOsPrintf ("Invalid zero length subtable\n");
1625 return (AE_BAD_DATA);
1626 }
1627
1628 return (AE_OK);
1629 }
1630