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