dmtable.c revision 1.1.1.20 1 /******************************************************************************
2 *
3 * Module Name: dmtable - Support for ACPI tables that contain no AML code
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2021, 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 MERCHANTABILITY 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 *AcpiDmAestResourceNames[] =
70 {
71 "Cache Resource",
72 "TLB Resource",
73 "Generic Resource",
74 "Unknown Resource Type" /* Reserved */
75 };
76
77 static const char *AcpiDmAestSubnames[] =
78 {
79 "Processor Error Node",
80 "Memory Error Node",
81 "SMMU Error Node",
82 "Vendor-defined Error Node",
83 "GIC Error Node",
84 "Unknown Subtable Type" /* Reserved */
85 };
86
87 static const char *AcpiDmAestCacheNames[] =
88 {
89 "Data Cache",
90 "Instruction Cache",
91 "Unified Cache",
92 "Unknown Cache Type" /* Reserved */
93 };
94
95 static const char *AcpiDmAestGicNames[] =
96 {
97 "GIC CPU",
98 "GIC Distributor",
99 "GIC Redistributor",
100 "GIC ITS",
101 "Unknown GIC Interface Type" /* Reserved */
102 };
103
104 static const char *AcpiDmAestXfaceNames[] =
105 {
106 "System Register Interface",
107 "Memory Mapped Interface",
108 "Unknown Interface Type" /* Reserved */
109 };
110
111 static const char *AcpiDmAestXruptNames[] =
112 {
113 "Fault Handling Interrupt",
114 "Error Recovery Interrupt",
115 "Unknown Interrupt Type" /* Reserved */
116 };
117
118 static const char *AcpiDmAsfSubnames[] =
119 {
120 "ASF Information",
121 "ASF Alerts",
122 "ASF Remote Control",
123 "ASF RMCP Boot Options",
124 "ASF Address",
125 "Unknown Subtable Type" /* Reserved */
126 };
127
128 static const char *AcpiDmCedtSubnames[] =
129 {
130 "CXL Host Bridge Structure",
131 "CXL Fixed Memory Window Structure",
132 "Unknown Subtable Type" /* Reserved */
133 };
134
135 static const char *AcpiDmDmarSubnames[] =
136 {
137 "Hardware Unit Definition",
138 "Reserved Memory Region",
139 "Root Port ATS Capability",
140 "Remapping Hardware Static Affinity",
141 "ACPI Namespace Device Declaration",
142 "Unknown Subtable Type" /* Reserved */
143 };
144
145 static const char *AcpiDmDmarScope[] =
146 {
147 "Reserved value",
148 "PCI Endpoint Device",
149 "PCI Bridge Device",
150 "IOAPIC Device",
151 "Message-capable HPET Device",
152 "Namespace Device",
153 "Unknown Scope Type" /* Reserved */
154 };
155
156 static const char *AcpiDmEinjActions[] =
157 {
158 "Begin Operation",
159 "Get Trigger Table",
160 "Set Error Type",
161 "Get Error Type",
162 "End Operation",
163 "Execute Operation",
164 "Check Busy Status",
165 "Get Command Status",
166 "Set Error Type With Address",
167 "Get Execute Timings",
168 "Unknown Action"
169 };
170
171 static const char *AcpiDmEinjInstructions[] =
172 {
173 "Read Register",
174 "Read Register Value",
175 "Write Register",
176 "Write Register Value",
177 "Noop",
178 "Flush Cacheline",
179 "Unknown Instruction"
180 };
181
182 static const char *AcpiDmErstActions[] =
183 {
184 "Begin Write Operation",
185 "Begin Read Operation",
186 "Begin Clear Operation",
187 "End Operation",
188 "Set Record Offset",
189 "Execute Operation",
190 "Check Busy Status",
191 "Get Command Status",
192 "Get Record Identifier",
193 "Set Record Identifier",
194 "Get Record Count",
195 "Begin Dummy Write",
196 "Unused/Unknown Action",
197 "Get Error Address Range",
198 "Get Error Address Length",
199 "Get Error Attributes",
200 "Execute Timings",
201 "Unknown Action"
202 };
203
204 static const char *AcpiDmErstInstructions[] =
205 {
206 "Read Register",
207 "Read Register Value",
208 "Write Register",
209 "Write Register Value",
210 "Noop",
211 "Load Var1",
212 "Load Var2",
213 "Store Var1",
214 "Add",
215 "Subtract",
216 "Add Value",
217 "Subtract Value",
218 "Stall",
219 "Stall While True",
220 "Skip Next If True",
221 "GoTo",
222 "Set Source Address",
223 "Set Destination Address",
224 "Move Data",
225 "Unknown Instruction"
226 };
227
228 static const char *AcpiDmGtdtSubnames[] =
229 {
230 "Generic Timer Block",
231 "Generic Watchdog Timer",
232 "Unknown Subtable Type" /* Reserved */
233 };
234
235 static const char *AcpiDmHestSubnames[] =
236 {
237 "IA-32 Machine Check Exception",
238 "IA-32 Corrected Machine Check",
239 "IA-32 Non-Maskable Interrupt",
240 "Unknown Subtable Type", /* 3 - Reserved */
241 "Unknown Subtable Type", /* 4 - Reserved */
242 "Unknown Subtable Type", /* 5 - Reserved */
243 "PCI Express Root Port AER",
244 "PCI Express AER (AER Endpoint)",
245 "PCI Express/PCI-X Bridge AER",
246 "Generic Hardware Error Source",
247 "Generic Hardware Error Source V2",
248 "IA-32 Deferred Machine Check",
249 "Unknown Subtable Type" /* Reserved */
250 };
251
252 static const char *AcpiDmHestNotifySubnames[] =
253 {
254 "Polled",
255 "External Interrupt",
256 "Local Interrupt",
257 "SCI",
258 "NMI",
259 "CMCI", /* ACPI 5.0 */
260 "MCE", /* ACPI 5.0 */
261 "GPIO", /* ACPI 6.0 */
262 "SEA", /* ACPI 6.1 */
263 "SEI", /* ACPI 6.1 */
264 "GSIV", /* ACPI 6.1 */
265 "Software Delegated Exception", /* ACPI 6.2 */
266 "Unknown Notify Type" /* Reserved */
267 };
268
269 static const char *AcpiDmHmatSubnames[] =
270 {
271 "Memory Proximity Domain Attributes",
272 "System Locality Latency and Bandwidth Information",
273 "Memory Side Cache Information",
274 "Unknown Structure Type" /* Reserved */
275 };
276
277 static const char *AcpiDmMadtSubnames[] =
278 {
279 "Processor Local APIC", /* ACPI_MADT_TYPE_LOCAL_APIC */
280 "I/O APIC", /* ACPI_MADT_TYPE_IO_APIC */
281 "Interrupt Source Override", /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */
282 "NMI Source", /* ACPI_MADT_TYPE_NMI_SOURCE */
283 "Local APIC NMI", /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */
284 "Local APIC Address Override", /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */
285 "I/O SAPIC", /* ACPI_MADT_TYPE_IO_SAPIC */
286 "Local SAPIC", /* ACPI_MADT_TYPE_LOCAL_SAPIC */
287 "Platform Interrupt Sources", /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */
288 "Processor Local x2APIC", /* ACPI_MADT_TYPE_LOCAL_X2APIC */
289 "Local x2APIC NMI", /* ACPI_MADT_TYPE_LOCAL_X2APIC_NMI */
290 "Generic Interrupt Controller", /* ACPI_MADT_GENERIC_INTERRUPT */
291 "Generic Interrupt Distributor", /* ACPI_MADT_GENERIC_DISTRIBUTOR */
292 "Generic MSI Frame", /* ACPI_MADT_GENERIC_MSI_FRAME */
293 "Generic Interrupt Redistributor", /* ACPI_MADT_GENERIC_REDISTRIBUTOR */
294 "Generic Interrupt Translator", /* ACPI_MADT_GENERIC_TRANSLATOR */
295 "Mutiprocessor Wakeup", /* ACPI_MADT_TYPE_MULTIPROC_WAKEUP */
296 "Unknown Subtable Type" /* Reserved */
297 };
298
299 static const char *AcpiDmNfitSubnames[] =
300 {
301 "System Physical Address Range", /* ACPI_NFIT_TYPE_SYSTEM_ADDRESS */
302 "Memory Range Map", /* ACPI_NFIT_TYPE_MEMORY_MAP */
303 "Interleave Info", /* ACPI_NFIT_TYPE_INTERLEAVE */
304 "SMBIOS Information", /* ACPI_NFIT_TYPE_SMBIOS */
305 "NVDIMM Control Region", /* ACPI_NFIT_TYPE_CONTROL_REGION */
306 "NVDIMM Block Data Window Region", /* ACPI_NFIT_TYPE_DATA_REGION */
307 "Flush Hint Address", /* ACPI_NFIT_TYPE_FLUSH_ADDRESS */
308 "Platform Capabilities", /* ACPI_NFIT_TYPE_CAPABILITIES */
309 "Unknown Subtable Type" /* Reserved */
310 };
311
312 static const char *AcpiDmNhltLinkTypeNames[] =
313 {
314 "Reserved for HD-Audio", /* ACPI_NHLT_RESERVED_HD_AUDIO */
315 "Reserved for DSP", /* ACPI_NHLT_RESERVED_DSP */
316 "Type PDM", /* ACPI_NHLT_PDM */
317 "Type SSP", /* ACPI_NHLT_SSP */
318 "Reserved for SlimBus", /* ACPI_NHLT_RESERVED_SLIMBUS */
319 "Reserved for SoundWire", /* ACPI_NHLT_RESERVED_SOUNDWIRE */
320 "Unknown Link Type" /* Reserved */
321 };
322
323 static const char *AcpiDmNhltDirectionNames[] =
324 {
325 "Render", /* ACPI_NHLT_DIR_RENDER */
326 "Capture", /* ACPI_NHLT_DIR_CAPTURE */
327 "Render with Loopback", /* ACPI_NHLT_DIR_RENDER_LOOPBACK */
328 "Feedback for Render", /* ACPI_NHLT_DIR_RENDER_FEEDBACK */
329 "Unknown Direction" /* Reserved */
330 };
331
332 static const char *AcpiDmPcctSubnames[] =
333 {
334 "Generic Communications Subspace", /* ACPI_PCCT_TYPE_GENERIC_SUBSPACE */
335 "HW-Reduced Comm Subspace", /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE */
336 "HW-Reduced Comm Subspace Type2", /* ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2 */
337 "Extended PCC Master Subspace", /* ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE */
338 "Extended PCC Slave Subspace", /* ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE */
339 "HW Registers based Comm Subspace", /* ACPI_PCCT_TYPE_HW_REG_COMM_SUBSPACE */
340 "Unknown Subtable Type" /* Reserved */
341 };
342
343 static const char *AcpiDmPhatSubnames[] =
344 {
345 "Firmware Version Data", /* ACPI_PHAT_TYPE_FW_VERSION_DATA */
346 "Firmware Health Data", /* ACPI_PHAT_TYPE_FW_HEALTH_DATA */
347 "Unknown Subtable Type" /* Reserved */
348 };
349
350 static const char *AcpiDmPmttSubnames[] =
351 {
352 "Socket", /* ACPI_PMTT_TYPE_SOCKET */
353 "Memory Controller", /* ACPI_PMTT_TYPE_CONTROLLER */
354 "Physical Component (DIMM)", /* ACPI_PMTT_TYPE_DIMM */
355 "Unknown Subtable Type", /* Reserved */
356 "Vendor Specific" /* ACPI_PMTT_TYPE_VENDOR */
357 };
358
359 static const char *AcpiDmPpttSubnames[] =
360 {
361 "Processor Hierarchy Node", /* ACPI_PPTT_TYPE_PROCESSOR */
362 "Cache Type", /* ACPI_PPTT_TYPE_CACHE */
363 "ID", /* ACPI_PPTT_TYPE_ID */
364 "Unknown Subtable Type" /* Reserved */
365 };
366
367 static const char *AcpiDmRgrtSubnames[] =
368 {
369 "Unknown/Reserved Image Type", /* ACPI_RGRT_TYPE_RESERVED0 */
370 "Type PNG" /* ACPI_RGRT_IMAGE_TYPE_PNG */
371 };
372
373 static const char *AcpiDmSdevSubnames[] =
374 {
375 "Namespace Device", /* ACPI_SDEV_TYPE_NAMESPACE_DEVICE */
376 "PCIe Endpoint Device", /* ACPI_SDEV_TYPE_PCIE_ENDPOINT_DEVICE */
377 "Unknown Subtable Type" /* Reserved */
378 };
379
380 static const char *AcpiDmSratSubnames[] =
381 {
382 "Processor Local APIC/SAPIC Affinity",
383 "Memory Affinity",
384 "Processor Local x2APIC Affinity",
385 "GICC Affinity",
386 "GIC ITS Affinity", /* Acpi 6.2 */
387 "Generic Initiator Affinity", /* Acpi 6.3 */
388 "Generic Port Affinity", /* Acpi 6.4 */
389 "Unknown Subtable Type" /* Reserved */
390 };
391
392 static const char *AcpiDmTpm2Subnames[] =
393 {
394 "Illegal Start Method value",
395 "Reserved",
396 "ACPI Start Method",
397 "Reserved",
398 "Reserved",
399 "Reserved",
400 "Memory Mapped I/O",
401 "Command Response Buffer",
402 "Command Response Buffer with ACPI Start Method",
403 "Reserved",
404 "Reserved",
405 "Command Response Buffer with ARM SMC",
406 "Unknown Subtable Type" /* Reserved */
407 };
408
409 static const char *AcpiDmIvrsSubnames[] =
410 {
411 "Hardware Definition Block (IVHD)",
412 "Hardware Definition Block - Mixed Format (IVHD)",
413 "Memory Definition Block (IVMD)",
414 "Unknown/Reserved Subtable Type" /* Reserved */
415 };
416
417 static const char *AcpiDmIvrsDevEntryNames[] =
418 {
419 "Unknown/Reserved Device Entry Type", /* 0- Reserved */
420 "Device Entry: Select All Devices", /* 1 */
421 "Device Entry: Select One Device", /* 2 */
422 "Device Entry: Start of Range", /* 3 */
423 "Device Entry: End of Range", /* 4 */
424 "Device Entry: Alias Select", /* 66 */
425 "Device Entry: Alias Start of Range", /* 67 */
426 "Unknown/Reserved Device Entry Type", /* 68- Reserved */
427 "Unknown/Reserved Device Entry Type", /* 69- Reserved */
428 "Device Entry: Extended Select", /* 70 */
429 "Device Entry: Extended Start of Range", /* 71 */
430 "Device Entry: Special Device", /* 72 */
431 "Device Entry: ACPI HID Named Device", /* 240 */
432 "Unknown/Reserved Device Entry Type" /* Reserved */
433 };
434
435 static const char *AcpiDmLpitSubnames[] =
436 {
437 "Native C-state Idle Structure",
438 "Unknown Subtable Type" /* Reserved */
439 };
440
441 static const char *AcpiDmViotSubnames[] =
442 {
443 "Unknown Subtable Type", /* 0 -Reserved */
444 "PCI Range",
445 "MMIO Endpoint",
446 "VirtIO-PCI IOMMU",
447 "VirtIO-MMIO IOMMU",
448 "Unknown Subtable Type" /* Reserved */
449 };
450
451 #define ACPI_FADT_PM_RESERVED 9
452
453 static const char *AcpiDmFadtProfiles[] =
454 {
455 "Unspecified",
456 "Desktop",
457 "Mobile",
458 "Workstation",
459 "Enterprise Server",
460 "SOHO Server",
461 "Appliance PC",
462 "Performance Server",
463 "Tablet",
464 "Unknown Profile Type"
465 };
466
467 #define ACPI_GAS_WIDTH_RESERVED 5
468
469 static const char *AcpiDmGasAccessWidth[] =
470 {
471 "Undefined/Legacy",
472 "Byte Access:8",
473 "Word Access:16",
474 "DWord Access:32",
475 "QWord Access:64",
476 "Unknown Width Encoding"
477 };
478
479
480 /*******************************************************************************
481 *
482 * ACPI Table Data, indexed by signature.
483 *
484 * Each entry contains: Signature, Table Info, Handler, DtHandler,
485 * Template, Description
486 *
487 * Simple tables have only a TableInfo structure, complex tables have a
488 * handler. This table must be NULL terminated. RSDP and FACS are
489 * special-cased elsewhere.
490 *
491 * Note: Any tables added here should be duplicated within
492 * AcpiGbl_SupportedTables in the file common/ahtable.c
493 *
494 ******************************************************************************/
495
496 const ACPI_DMTABLE_DATA AcpiDmTableData[] =
497 {
498 {ACPI_SIG_AEST, NULL, AcpiDmDumpAest, DtCompileAest, TemplateAest},
499 {ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, DtCompileAsf, TemplateAsf},
500 {ACPI_SIG_BDAT, AcpiDmTableInfoBdat, NULL, NULL, TemplateBdat},
501 {ACPI_SIG_BERT, AcpiDmTableInfoBert, NULL, NULL, TemplateBert},
502 {ACPI_SIG_BGRT, AcpiDmTableInfoBgrt, NULL, NULL, TemplateBgrt},
503 {ACPI_SIG_BOOT, AcpiDmTableInfoBoot, NULL, NULL, TemplateBoot},
504 {ACPI_SIG_CEDT, NULL, AcpiDmDumpCedt, DtCompileCedt, TemplateCedt},
505 {ACPI_SIG_CPEP, NULL, AcpiDmDumpCpep, DtCompileCpep, TemplateCpep},
506 {ACPI_SIG_CSRT, NULL, AcpiDmDumpCsrt, DtCompileCsrt, TemplateCsrt},
507 {ACPI_SIG_DBG2, AcpiDmTableInfoDbg2, AcpiDmDumpDbg2, DtCompileDbg2, TemplateDbg2},
508 {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp, NULL, NULL, TemplateDbgp},
509 {ACPI_SIG_DMAR, NULL, AcpiDmDumpDmar, DtCompileDmar, TemplateDmar},
510 {ACPI_SIG_DRTM, NULL, AcpiDmDumpDrtm, DtCompileDrtm, TemplateDrtm},
511 {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt, NULL, NULL, TemplateEcdt},
512 {ACPI_SIG_EINJ, NULL, AcpiDmDumpEinj, DtCompileEinj, TemplateEinj},
513 {ACPI_SIG_ERST, NULL, AcpiDmDumpErst, DtCompileErst, TemplateErst},
514 {ACPI_SIG_FADT, NULL, AcpiDmDumpFadt, DtCompileFadt, TemplateFadt},
515 {ACPI_SIG_FPDT, NULL, AcpiDmDumpFpdt, DtCompileFpdt, TemplateFpdt},
516 {ACPI_SIG_GTDT, NULL, AcpiDmDumpGtdt, DtCompileGtdt, TemplateGtdt},
517 {ACPI_SIG_HEST, NULL, AcpiDmDumpHest, DtCompileHest, TemplateHest},
518 {ACPI_SIG_HMAT, NULL, AcpiDmDumpHmat, DtCompileHmat, TemplateHmat},
519 {ACPI_SIG_HPET, AcpiDmTableInfoHpet, NULL, NULL, TemplateHpet},
520 {ACPI_SIG_IORT, NULL, AcpiDmDumpIort, DtCompileIort, TemplateIort},
521 {ACPI_SIG_IVRS, NULL, AcpiDmDumpIvrs, DtCompileIvrs, TemplateIvrs},
522 {ACPI_SIG_LPIT, NULL, AcpiDmDumpLpit, DtCompileLpit, TemplateLpit},
523 {ACPI_SIG_MADT, NULL, AcpiDmDumpMadt, DtCompileMadt, TemplateMadt},
524 {ACPI_SIG_MCFG, NULL, AcpiDmDumpMcfg, DtCompileMcfg, TemplateMcfg},
525 {ACPI_SIG_MCHI, AcpiDmTableInfoMchi, NULL, NULL, TemplateMchi},
526 {ACPI_SIG_MPST, AcpiDmTableInfoMpst, AcpiDmDumpMpst, DtCompileMpst, TemplateMpst},
527 {ACPI_SIG_MSCT, NULL, AcpiDmDumpMsct, DtCompileMsct, TemplateMsct},
528 {ACPI_SIG_MSDM, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateMsdm},
529 {ACPI_SIG_NFIT, AcpiDmTableInfoNfit, AcpiDmDumpNfit, DtCompileNfit, TemplateNfit},
530 {ACPI_SIG_NHLT, AcpiDmTableInfoNhlt, AcpiDmDumpNhlt, NULL, NULL},
531 {ACPI_SIG_PCCT, AcpiDmTableInfoPcct, AcpiDmDumpPcct, DtCompilePcct, TemplatePcct},
532 {ACPI_SIG_PDTT, AcpiDmTableInfoPdtt, AcpiDmDumpPdtt, DtCompilePdtt, TemplatePdtt},
533 {ACPI_SIG_PHAT, NULL, AcpiDmDumpPhat, DtCompilePhat, TemplatePhat},
534 {ACPI_SIG_PMTT, NULL, AcpiDmDumpPmtt, DtCompilePmtt, TemplatePmtt},
535 {ACPI_SIG_PPTT, NULL, AcpiDmDumpPptt, DtCompilePptt, TemplatePptt},
536 {ACPI_SIG_PRMT, NULL, AcpiDmDumpPrmt, DtCompilePrmt, TemplatePrmt},
537 {ACPI_SIG_RASF, AcpiDmTableInfoRasf, NULL, NULL, TemplateRasf},
538 {ACPI_SIG_RGRT, NULL, AcpiDmDumpRgrt, DtCompileRgrt, TemplateRgrt},
539 {ACPI_SIG_RSDT, NULL, AcpiDmDumpRsdt, DtCompileRsdt, TemplateRsdt},
540 {ACPI_SIG_S3PT, NULL, NULL, NULL, TemplateS3pt},
541 {ACPI_SIG_SBST, AcpiDmTableInfoSbst, NULL, NULL, TemplateSbst},
542 {ACPI_SIG_SDEI, AcpiDmTableInfoSdei, NULL, NULL, TemplateSdei},
543 {ACPI_SIG_SDEV, AcpiDmTableInfoSdev, AcpiDmDumpSdev, DtCompileSdev, TemplateSdev},
544 {ACPI_SIG_SLIC, NULL, AcpiDmDumpSlic, DtCompileSlic, TemplateSlic},
545 {ACPI_SIG_SLIT, NULL, AcpiDmDumpSlit, DtCompileSlit, TemplateSlit},
546 {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr, NULL, NULL, TemplateSpcr},
547 {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi, NULL, NULL, TemplateSpmi},
548 {ACPI_SIG_SRAT, NULL, AcpiDmDumpSrat, DtCompileSrat, TemplateSrat},
549 {ACPI_SIG_STAO, NULL, AcpiDmDumpStao, DtCompileStao, TemplateStao},
550 {ACPI_SIG_SVKL, AcpiDmTableInfoSvkl, AcpiDmDumpSvkl, DtCompileSvkl, TemplateSvkl},
551 {ACPI_SIG_TCPA, NULL, AcpiDmDumpTcpa, DtCompileTcpa, TemplateTcpa},
552 {ACPI_SIG_TPM2, AcpiDmTableInfoTpm2, AcpiDmDumpTpm2, DtCompileTpm2, TemplateTpm2},
553 {ACPI_SIG_UEFI, AcpiDmTableInfoUefi, NULL, DtCompileUefi, TemplateUefi},
554 {ACPI_SIG_VIOT, AcpiDmTableInfoViot, AcpiDmDumpViot, DtCompileViot, TemplateViot},
555 {ACPI_SIG_WAET, AcpiDmTableInfoWaet, NULL, NULL, TemplateWaet},
556 {ACPI_SIG_WDAT, NULL, AcpiDmDumpWdat, DtCompileWdat, TemplateWdat},
557 {ACPI_SIG_WDDT, AcpiDmTableInfoWddt, NULL, NULL, TemplateWddt},
558 {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt, NULL, NULL, TemplateWdrt},
559 {ACPI_SIG_WPBT, NULL, AcpiDmDumpWpbt, DtCompileWpbt, TemplateWpbt},
560 {ACPI_SIG_WSMT, AcpiDmTableInfoWsmt, NULL, NULL, TemplateWsmt},
561 {ACPI_SIG_XENV, AcpiDmTableInfoXenv, NULL, NULL, TemplateXenv},
562 {ACPI_SIG_XSDT, NULL, AcpiDmDumpXsdt, DtCompileXsdt, TemplateXsdt},
563 {NULL, NULL, NULL, NULL, NULL}
564 };
565
566
567 /*******************************************************************************
568 *
569 * FUNCTION: AcpiDmGenerateChecksum
570 *
571 * PARAMETERS: Table - Pointer to table to be checksummed
572 * Length - Length of the table
573 * OriginalChecksum - Value of the checksum field
574 *
575 * RETURN: 8 bit checksum of buffer
576 *
577 * DESCRIPTION: Computes an 8 bit checksum of the table.
578 *
579 ******************************************************************************/
580
581 UINT8
582 AcpiDmGenerateChecksum (
583 void *Table,
584 UINT32 Length,
585 UINT8 OriginalChecksum)
586 {
587 UINT8 Checksum;
588
589
590 /* Sum the entire table as-is */
591
592 Checksum = AcpiTbChecksum ((UINT8 *) Table, Length);
593
594 /* Subtract off the existing checksum value in the table */
595
596 Checksum = (UINT8) (Checksum - OriginalChecksum);
597
598 /* Compute the final checksum */
599
600 Checksum = (UINT8) (0 - Checksum);
601 return (Checksum);
602 }
603
604
605 /*******************************************************************************
606 *
607 * FUNCTION: AcpiDmGetTableData
608 *
609 * PARAMETERS: Signature - ACPI signature (4 chars) to match
610 *
611 * RETURN: Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found.
612 *
613 * DESCRIPTION: Find a match in the global table of supported ACPI tables
614 *
615 ******************************************************************************/
616
617 const ACPI_DMTABLE_DATA *
618 AcpiDmGetTableData (
619 char *Signature)
620 {
621 const ACPI_DMTABLE_DATA *Info;
622
623
624 for (Info = AcpiDmTableData; Info->Signature; Info++)
625 {
626 if (ACPI_COMPARE_NAMESEG (Signature, Info->Signature))
627 {
628 return (Info);
629 }
630 }
631
632 return (NULL);
633 }
634
635
636 /*******************************************************************************
637 *
638 * FUNCTION: AcpiDmDumpDataTable
639 *
640 * PARAMETERS: Table - An ACPI table
641 *
642 * RETURN: None.
643 *
644 * DESCRIPTION: Format the contents of an ACPI data table (any table other
645 * than an SSDT or DSDT that does not contain executable AML code)
646 *
647 ******************************************************************************/
648
649 void
650 AcpiDmDumpDataTable (
651 ACPI_TABLE_HEADER *Table)
652 {
653 ACPI_STATUS Status;
654 const ACPI_DMTABLE_DATA *TableData;
655 UINT32 Length;
656
657
658 /* Ignore tables that contain AML */
659
660 if (AcpiUtIsAmlTable (Table))
661 {
662 if (AslGbl_VerboseTemplates)
663 {
664 /* Dump the raw table data */
665
666 Length = Table->Length;
667
668 AcpiOsPrintf ("\n/*\n%s: Length %d (0x%X)\n\n",
669 ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
670 AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
671 Length, DB_BYTE_DISPLAY, 0);
672 AcpiOsPrintf (" */\n");
673 }
674 return;
675 }
676
677 /*
678 * Handle tables that don't use the common ACPI table header structure.
679 * Currently, these are the FACS, RSDP, and S3PT.
680 */
681 if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_FACS))
682 {
683 Length = Table->Length;
684 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs);
685 if (ACPI_FAILURE (Status))
686 {
687 return;
688 }
689 }
690 else if (ACPI_VALIDATE_RSDP_SIG (Table->Signature))
691 {
692 Length = AcpiDmDumpRsdp (Table);
693 }
694 else if (ACPI_COMPARE_NAMESEG (Table->Signature, ACPI_SIG_S3PT))
695 {
696 Length = AcpiDmDumpS3pt (Table);
697 }
698 else
699 {
700 /*
701 * All other tables must use the common ACPI table header, dump it now
702 */
703 Length = Table->Length;
704 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader);
705 if (ACPI_FAILURE (Status))
706 {
707 return;
708 }
709 AcpiOsPrintf ("\n");
710
711 /* Match signature and dispatch appropriately */
712
713 TableData = AcpiDmGetTableData (Table->Signature);
714 if (!TableData)
715 {
716 if (!strncmp (Table->Signature, "OEM", 3))
717 {
718 AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n",
719 Table->Signature);
720 }
721 else
722 {
723 AcpiOsPrintf ("\n**** Unknown ACPI table signature [%4.4s]\n\n",
724 Table->Signature);
725
726 fprintf (stderr, "Unknown ACPI table signature [%4.4s], ",
727 Table->Signature);
728
729 if (!AcpiGbl_ForceAmlDisassembly)
730 {
731 fprintf (stderr, "decoding ACPI table header only\n");
732 }
733 else
734 {
735 fprintf (stderr, "assuming table contains valid AML code\n");
736 }
737 }
738 }
739 else if (TableData->TableHandler)
740 {
741 /* Complex table, has a handler */
742
743 TableData->TableHandler (Table);
744 }
745 else if (TableData->TableInfo)
746 {
747 /* Simple table, just walk the info table */
748
749 Status = AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo);
750 if (ACPI_FAILURE (Status))
751 {
752 return;
753 }
754 }
755 }
756
757 if (!AslGbl_DoTemplates || AslGbl_VerboseTemplates)
758 {
759 /* Dump the raw table data */
760
761 AcpiOsPrintf ("\n%s: Length %d (0x%X)\n\n",
762 ACPI_RAW_TABLE_DATA_HEADER, Length, Length);
763 AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, Table),
764 Length, DB_BYTE_DISPLAY, 0);
765 }
766 }
767
768
769 /*******************************************************************************
770 *
771 * FUNCTION: AcpiDmLineHeader
772 *
773 * PARAMETERS: Offset - Current byte offset, from table start
774 * ByteLength - Length of the field in bytes, 0 for flags
775 * Name - Name of this field
776 *
777 * RETURN: None
778 *
779 * DESCRIPTION: Utility routines for formatting output lines. Displays the
780 * current table offset in hex and decimal, the field length,
781 * and the field name.
782 *
783 ******************************************************************************/
784
785 void
786 AcpiDmLineHeader (
787 UINT32 Offset,
788 UINT32 ByteLength,
789 char *Name)
790 {
791
792 /* Allow a null name for fields that span multiple lines (large buffers) */
793
794 if (!Name)
795 {
796 Name = "";
797 }
798
799 if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */
800 {
801 if (ByteLength)
802 {
803 AcpiOsPrintf ("[%.4d] %34s : ", ByteLength, Name);
804 }
805 else
806 {
807 if (*Name)
808 {
809 AcpiOsPrintf ("%41s : ", Name);
810 }
811 else
812 {
813 AcpiOsPrintf ("%41s ", Name);
814 }
815 }
816 }
817 else /* Normal disassembler or verbose template */
818 {
819 if (ByteLength)
820 {
821 AcpiOsPrintf ("[%3.3Xh %4.4d% 4d] %28s : ",
822 Offset, Offset, ByteLength, Name);
823 }
824 else
825 {
826 if (*Name)
827 {
828 AcpiOsPrintf ("%44s : ", Name);
829 }
830 else
831 {
832 AcpiOsPrintf ("%44s ", Name);
833 }
834 }
835 }
836 }
837
838 void
839 AcpiDmLineHeader2 (
840 UINT32 Offset,
841 UINT32 ByteLength,
842 char *Name,
843 UINT32 Value)
844 {
845
846 if (AslGbl_DoTemplates && !AslGbl_VerboseTemplates) /* Terse template */
847 {
848 if (ByteLength)
849 {
850 AcpiOsPrintf ("[%.4d] %30s %3d : ",
851 ByteLength, Name, Value);
852 }
853 else
854 {
855 AcpiOsPrintf ("%36s % 3d : ",
856 Name, Value);
857 }
858 }
859 else /* Normal disassembler or verbose template */
860 {
861 if (ByteLength)
862 {
863 AcpiOsPrintf ("[%3.3Xh %4.4d %3d] %24s %3d : ",
864 Offset, Offset, ByteLength, Name, Value);
865 }
866 else
867 {
868 AcpiOsPrintf ("[%3.3Xh %4.4d ] %24s %3d : ",
869 Offset, Offset, Name, Value);
870 }
871 }
872 }
873
874
875 /*******************************************************************************
876 *
877 * FUNCTION: AcpiDmDumpTable
878 *
879 * PARAMETERS: TableLength - Length of the entire ACPI table
880 * TableOffset - Starting offset within the table for this
881 * sub-descriptor (0 if main table)
882 * Table - The ACPI table
883 * SubtableLength - Length of this sub-descriptor
884 * Info - Info table for this ACPI table
885 *
886 * RETURN: Status
887 *
888 * DESCRIPTION: Display ACPI table contents by walking the Info table.
889 *
890 * Note: This function must remain in sync with DtGetFieldLength.
891 *
892 ******************************************************************************/
893
894 ACPI_STATUS
895 AcpiDmDumpTable (
896 UINT32 TableLength,
897 UINT32 TableOffset,
898 void *Table,
899 UINT32 SubtableLength,
900 ACPI_DMTABLE_INFO *Info)
901 {
902 UINT8 *Target;
903 UINT32 CurrentOffset;
904 UINT32 ByteLength;
905 UINT8 Temp8;
906 UINT16 Temp16;
907 UINT32 Temp32;
908 UINT64 Value;
909 const AH_TABLE *TableData;
910 const char *Name;
911 BOOLEAN LastOutputBlankLine = FALSE;
912 ACPI_STATUS Status;
913 char RepairedName[8];
914
915
916 if (!Info)
917 {
918 AcpiOsPrintf ("Display not implemented\n");
919 return (AE_NOT_IMPLEMENTED);
920 }
921
922 /* Walk entire Info table; Null name terminates */
923
924 for (; Info->Name; Info++)
925 {
926 /*
927 * Target points to the field within the ACPI Table. CurrentOffset is
928 * the offset of the field from the start of the main table.
929 */
930 Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset);
931 CurrentOffset = TableOffset + Info->Offset;
932
933 /* Check for beyond subtable end or (worse) beyond EOT */
934
935 if (SubtableLength && (Info->Offset >= SubtableLength))
936 {
937 AcpiOsPrintf (
938 "/**** ACPI subtable terminates early (Len %u) - "
939 "may be older version (dump table) */\n", SubtableLength);
940
941 /* Move on to next subtable */
942
943 return (AE_OK);
944 }
945
946 if (CurrentOffset >= TableLength)
947 {
948 AcpiOsPrintf (
949 "/**** ACPI table terminates "
950 "in the middle of a data structure! (dump table) */\n");
951 return (AE_BAD_DATA);
952 }
953
954 /* Generate the byte length for this field */
955
956 switch (Info->Opcode)
957 {
958 case ACPI_DMT_UINT8:
959 case ACPI_DMT_CHKSUM:
960 case ACPI_DMT_SPACEID:
961 case ACPI_DMT_ACCWIDTH:
962 case ACPI_DMT_CEDT:
963 case ACPI_DMT_IVRS:
964 case ACPI_DMT_IVRS_DE:
965 case ACPI_DMT_GTDT:
966 case ACPI_DMT_MADT:
967 case ACPI_DMT_NHLT1:
968 case ACPI_DMT_NHLT1a:
969 case ACPI_DMT_PCCT:
970 case ACPI_DMT_PMTT:
971 case ACPI_DMT_PPTT:
972 case ACPI_DMT_RGRT:
973 case ACPI_DMT_SDEV:
974 case ACPI_DMT_SRAT:
975 case ACPI_DMT_AEST:
976 case ACPI_DMT_AEST_RES:
977 case ACPI_DMT_AEST_XFACE:
978 case ACPI_DMT_AEST_XRUPT:
979 case ACPI_DMT_ASF:
980 case ACPI_DMT_HESTNTYP:
981 case ACPI_DMT_FADTPM:
982 case ACPI_DMT_EINJACT:
983 case ACPI_DMT_EINJINST:
984 case ACPI_DMT_ERSTACT:
985 case ACPI_DMT_ERSTINST:
986 case ACPI_DMT_DMAR_SCOPE:
987 case ACPI_DMT_VIOT:
988
989 ByteLength = 1;
990 break;
991
992 case ACPI_DMT_UINT16:
993 case ACPI_DMT_DMAR:
994 case ACPI_DMT_HEST:
995 case ACPI_DMT_HMAT:
996 case ACPI_DMT_NFIT:
997 case ACPI_DMT_PHAT:
998
999 ByteLength = 2;
1000 break;
1001
1002 case ACPI_DMT_UINT24:
1003
1004 ByteLength = 3;
1005 break;
1006
1007 case ACPI_DMT_UINT32:
1008 case ACPI_DMT_AEST_CACHE:
1009 case ACPI_DMT_AEST_GIC:
1010 case ACPI_DMT_NAME4:
1011 case ACPI_DMT_SIG:
1012 case ACPI_DMT_LPIT:
1013 case ACPI_DMT_TPM2:
1014
1015 ByteLength = 4;
1016 break;
1017
1018 case ACPI_DMT_UINT40:
1019
1020 ByteLength = 5;
1021 break;
1022
1023 case ACPI_DMT_UINT48:
1024 case ACPI_DMT_NAME6:
1025
1026 ByteLength = 6;
1027 break;
1028
1029 case ACPI_DMT_UINT56:
1030 case ACPI_DMT_BUF7:
1031
1032 ByteLength = 7;
1033 break;
1034
1035 case ACPI_DMT_UINT64:
1036 case ACPI_DMT_NAME8:
1037
1038 ByteLength = 8;
1039 break;
1040
1041 case ACPI_DMT_BUF10:
1042
1043 ByteLength = 10;
1044 break;
1045
1046 case ACPI_DMT_BUF12:
1047
1048 ByteLength = 12;
1049 break;
1050
1051 case ACPI_DMT_BUF16:
1052 case ACPI_DMT_UUID:
1053
1054 ByteLength = 16;
1055 break;
1056
1057 case ACPI_DMT_BUF18:
1058
1059 ByteLength = 18;
1060 break;
1061
1062 case ACPI_DMT_BUF128:
1063
1064 ByteLength = 128;
1065 break;
1066
1067 case ACPI_DMT_WPBT_UNICODE:
1068
1069 ByteLength = SubtableLength;
1070 CurrentOffset = sizeof (ACPI_TABLE_WPBT);
1071 break;
1072
1073 case ACPI_DMT_UNICODE:
1074 case ACPI_DMT_BUFFER:
1075 case ACPI_DMT_RAW_BUFFER:
1076
1077 ByteLength = SubtableLength;
1078 break;
1079
1080 case ACPI_DMT_PMTT_VENDOR:
1081 /*
1082 * Calculate the length of the vendor data for the PMTT table:
1083 * Length = (Current Subtable ptr + Subtable length) -
1084 * Start of the vendor data (Target)
1085 */
1086 ByteLength = ((ACPI_CAST_PTR (char, Table) +
1087 (ACPI_CAST_PTR (ACPI_PMTT_HEADER, Table)->Length)) -
1088 ACPI_CAST_PTR (char, Target));
1089 break;
1090
1091 case ACPI_DMT_STRING:
1092
1093 ByteLength = strlen (ACPI_CAST_PTR (char, Target)) + 1;
1094 break;
1095
1096 case ACPI_DMT_IVRS_UNTERMINATED_STRING:
1097
1098 ByteLength = ((ACPI_CAST_PTR (ACPI_IVRS_DEVICE_HID, Target) -1)->UidLength);
1099 break;
1100
1101 case ACPI_DMT_GAS:
1102
1103 if (!LastOutputBlankLine)
1104 {
1105 AcpiOsPrintf ("\n");
1106 LastOutputBlankLine = TRUE;
1107 }
1108
1109 ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
1110 break;
1111
1112 case ACPI_DMT_HESTNTFY:
1113
1114 if (!LastOutputBlankLine)
1115 {
1116 AcpiOsPrintf ("\n");
1117 LastOutputBlankLine = TRUE;
1118 }
1119
1120 ByteLength = sizeof (ACPI_HEST_NOTIFY);
1121 break;
1122
1123 case ACPI_DMT_IORTMEM:
1124
1125 if (!LastOutputBlankLine)
1126 {
1127 LastOutputBlankLine = FALSE;
1128 }
1129
1130 ByteLength = sizeof (ACPI_IORT_MEMORY_ACCESS);
1131 break;
1132
1133 default:
1134
1135 ByteLength = 0;
1136 break;
1137 }
1138
1139 /* Check if we are beyond a subtable, or (worse) beyond EOT */
1140
1141 if (CurrentOffset + ByteLength > TableLength)
1142 {
1143 if (SubtableLength)
1144 {
1145 AcpiOsPrintf (
1146 "/**** ACPI subtable terminates early - "
1147 "may be older version (dump table) */\n");
1148
1149 /* Move on to next subtable */
1150
1151 return (AE_OK);
1152 }
1153
1154 AcpiOsPrintf (
1155 "/**** ACPI table terminates "
1156 "in the middle of a data structure! */\n");
1157 return (AE_BAD_DATA);
1158 }
1159
1160 if (Info->Opcode == ACPI_DMT_EXTRA_TEXT)
1161 {
1162 AcpiOsPrintf ("%s", Info->Name);
1163 continue;
1164 }
1165
1166 /* Start a new line and decode the opcode */
1167
1168 AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name);
1169
1170 switch (Info->Opcode)
1171 {
1172 /* Single-bit Flag fields. Note: Opcode is the bit position */
1173
1174 case ACPI_DMT_FLAG0:
1175 case ACPI_DMT_FLAG1:
1176 case ACPI_DMT_FLAG2:
1177 case ACPI_DMT_FLAG3:
1178 case ACPI_DMT_FLAG4:
1179 case ACPI_DMT_FLAG5:
1180 case ACPI_DMT_FLAG6:
1181 case ACPI_DMT_FLAG7:
1182
1183 AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01);
1184 break;
1185
1186 /* 2-bit Flag fields */
1187
1188 case ACPI_DMT_FLAGS0:
1189
1190 AcpiOsPrintf ("%1.1X\n", *Target & 0x03);
1191 break;
1192
1193 case ACPI_DMT_FLAGS1:
1194
1195 AcpiOsPrintf ("%1.1X\n", (*Target >> 1) & 0x03);
1196 break;
1197
1198 case ACPI_DMT_FLAGS2:
1199
1200 AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03);
1201 break;
1202
1203 case ACPI_DMT_FLAGS4:
1204
1205 AcpiOsPrintf ("%1.1X\n", (*Target >> 4) & 0x03);
1206 break;
1207
1208 case ACPI_DMT_FLAGS4_0:
1209
1210 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target) & 0x0F);
1211 break;
1212
1213 case ACPI_DMT_FLAGS4_4:
1214
1215 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 4) & 0x0F);
1216 break;
1217
1218 case ACPI_DMT_FLAGS4_8:
1219
1220 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 8) & 0x0F);
1221 break;
1222
1223 case ACPI_DMT_FLAGS4_12:
1224
1225 AcpiOsPrintf ("%1.1X\n", (*(UINT32 *)Target >> 12) & 0x0F);
1226 break;
1227
1228 case ACPI_DMT_FLAGS16_16:
1229
1230 AcpiOsPrintf ("%4.4X\n", (*(UINT32 *)Target >> 16) & 0xFFFF);
1231 break;
1232
1233 /* Integer Data Types */
1234
1235 case ACPI_DMT_UINT8:
1236 case ACPI_DMT_UINT16:
1237 case ACPI_DMT_UINT24:
1238 case ACPI_DMT_UINT32:
1239 case ACPI_DMT_UINT40:
1240 case ACPI_DMT_UINT48:
1241 case ACPI_DMT_UINT56:
1242 case ACPI_DMT_UINT64:
1243 /*
1244 * Dump bytes - high byte first, low byte last.
1245 * Note: All ACPI tables are little-endian.
1246 */
1247 Value = 0;
1248 for (Temp8 = (UINT8) ByteLength; Temp8 > 0; Temp8--)
1249 {
1250 AcpiOsPrintf ("%2.2X", Target[Temp8 - 1]);
1251 Value |= Target[Temp8 - 1];
1252 Value <<= 8;
1253 }
1254
1255 if (!Value && (Info->Flags & DT_DESCRIBES_OPTIONAL))
1256 {
1257 AcpiOsPrintf (" [Optional field not present]");
1258 }
1259
1260 AcpiOsPrintf ("\n");
1261 break;
1262
1263 case ACPI_DMT_BUF7:
1264 case ACPI_DMT_BUF10:
1265 case ACPI_DMT_BUF12:
1266 case ACPI_DMT_BUF16:
1267 case ACPI_DMT_BUF18:
1268 case ACPI_DMT_BUF128:
1269 /*
1270 * Buffer: Size depends on the opcode and was set above.
1271 * Each hex byte is separated with a space.
1272 * Multiple lines are separated by line continuation char.
1273 */
1274 for (Temp16 = 0; Temp16 < ByteLength; Temp16++)
1275 {
1276 AcpiOsPrintf ("%2.2X", Target[Temp16]);
1277 if ((UINT32) (Temp16 + 1) < ByteLength)
1278 {
1279 if ((Temp16 > 0) && (!((Temp16+1) % 16)))
1280 {
1281 AcpiOsPrintf (" \\\n"); /* Line continuation */
1282 AcpiDmLineHeader (0, 0, NULL);
1283 }
1284 else
1285 {
1286 AcpiOsPrintf (" ");
1287 }
1288 }
1289 }
1290
1291 AcpiOsPrintf ("\n");
1292 break;
1293
1294 case ACPI_DMT_UUID:
1295
1296 /* Convert 16-byte UUID buffer to 36-byte formatted UUID string */
1297
1298 (void) AcpiUtConvertUuidToString ((char *) Target, AslGbl_MsgBuffer);
1299
1300 AcpiOsPrintf ("%s\n", AslGbl_MsgBuffer);
1301 break;
1302
1303 case ACPI_DMT_STRING:
1304
1305 AcpiOsPrintf ("\"%s\"\n", ACPI_CAST_PTR (char, Target));
1306 break;
1307
1308 case ACPI_DMT_IVRS_UNTERMINATED_STRING:
1309
1310 AcpiOsPrintf ("\"%.*s\"\n", ByteLength, ACPI_CAST_PTR (char, Target));
1311 break;
1312
1313 /* Fixed length ASCII name fields */
1314
1315 case ACPI_DMT_SIG:
1316
1317 AcpiUtCheckAndRepairAscii (Target, RepairedName, 4);
1318 AcpiOsPrintf ("\"%.4s\" ", RepairedName);
1319
1320 TableData = AcpiAhGetTableInfo (ACPI_CAST_PTR (char, Target));
1321 if (TableData)
1322 {
1323 AcpiOsPrintf (STRING_FORMAT, TableData->Description);
1324 }
1325 else
1326 {
1327 AcpiOsPrintf ("\n");
1328 }
1329 break;
1330
1331 case ACPI_DMT_NAME4:
1332
1333 AcpiUtCheckAndRepairAscii (Target, RepairedName, 4);
1334 AcpiOsPrintf ("\"%.4s\"\n", RepairedName);
1335 break;
1336
1337 case ACPI_DMT_NAME6:
1338
1339 AcpiUtCheckAndRepairAscii (Target, RepairedName, 6);
1340 AcpiOsPrintf ("\"%.6s\"\n", RepairedName);
1341 break;
1342
1343 case ACPI_DMT_NAME8:
1344
1345 AcpiUtCheckAndRepairAscii (Target, RepairedName, 8);
1346 AcpiOsPrintf ("\"%.8s\"\n", RepairedName);
1347 break;
1348
1349 /* Special Data Types */
1350
1351 case ACPI_DMT_CHKSUM:
1352
1353 /* Checksum, display and validate */
1354
1355 AcpiOsPrintf ("%2.2X", *Target);
1356 Temp8 = AcpiDmGenerateChecksum (Table,
1357 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
1358 ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum);
1359
1360 if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
1361 {
1362 AcpiOsPrintf (
1363 " /* Incorrect checksum, should be %2.2X */", Temp8);
1364 }
1365
1366 AcpiOsPrintf ("\n");
1367 break;
1368
1369 case ACPI_DMT_SPACEID:
1370
1371 /* Address Space ID */
1372
1373 AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiUtGetRegionName (*Target));
1374 break;
1375
1376 case ACPI_DMT_ACCWIDTH:
1377
1378 /* Encoded Access Width */
1379
1380 Temp8 = *Target;
1381 if (Temp8 > ACPI_GAS_WIDTH_RESERVED)
1382 {
1383 Temp8 = ACPI_GAS_WIDTH_RESERVED;
1384 }
1385
1386 AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmGasAccessWidth[Temp8]);
1387 break;
1388
1389 case ACPI_DMT_GAS:
1390
1391 /* Generic Address Structure */
1392
1393 AcpiOsPrintf (STRING_FORMAT, "Generic Address Structure");
1394 Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1395 sizeof (ACPI_GENERIC_ADDRESS), AcpiDmTableInfoGas);
1396 if (ACPI_FAILURE (Status))
1397 {
1398 return (Status);
1399 }
1400
1401 AcpiOsPrintf ("\n");
1402 LastOutputBlankLine = TRUE;
1403 break;
1404
1405 case ACPI_DMT_AEST:
1406
1407 /* AEST subtable types */
1408
1409 Temp8 = *Target;
1410 if (Temp8 > ACPI_AEST_NODE_TYPE_RESERVED)
1411 {
1412 Temp8 = ACPI_AEST_NODE_TYPE_RESERVED;
1413 }
1414
1415 AcpiOsPrintf (UINT8_FORMAT, *Target,
1416 AcpiDmAestSubnames[Temp8]);
1417 break;
1418
1419 case ACPI_DMT_AEST_CACHE:
1420
1421 /* AEST cache resource subtable */
1422
1423 Temp32 = *Target;
1424 if (Temp32 > ACPI_AEST_CACHE_RESERVED)
1425 {
1426 Temp32 = ACPI_AEST_CACHE_RESERVED;
1427 }
1428
1429 AcpiOsPrintf (UINT32_FORMAT, *Target,
1430 AcpiDmAestCacheNames[Temp32]);
1431 break;
1432
1433 case ACPI_DMT_AEST_GIC:
1434
1435 /* AEST GIC error subtable */
1436
1437 Temp32 = *Target;
1438 if (Temp32 > ACPI_AEST_GIC_RESERVED)
1439 {
1440 Temp32 = ACPI_AEST_GIC_RESERVED;
1441 }
1442
1443 AcpiOsPrintf (UINT32_FORMAT, *Target,
1444 AcpiDmAestGicNames[Temp32]);
1445 break;
1446
1447 case ACPI_DMT_AEST_RES:
1448
1449 /* AEST resource type subtable */
1450
1451 Temp8 = *Target;
1452 if (Temp8 > ACPI_AEST_RESOURCE_RESERVED)
1453 {
1454 Temp8 = ACPI_AEST_RESOURCE_RESERVED;
1455 }
1456
1457 AcpiOsPrintf (UINT8_FORMAT, *Target,
1458 AcpiDmAestResourceNames[Temp8]);
1459 break;
1460
1461 case ACPI_DMT_AEST_XFACE:
1462
1463 /* AEST interface structure types */
1464
1465 Temp8 = *Target;
1466 if (Temp8 > ACPI_AEST_XFACE_RESERVED)
1467 {
1468 Temp8 = ACPI_AEST_XFACE_RESERVED;
1469 }
1470
1471 AcpiOsPrintf (UINT8_FORMAT, *Target,
1472 AcpiDmAestXfaceNames[Temp8]);
1473 break;
1474
1475 case ACPI_DMT_AEST_XRUPT:
1476
1477 /* AEST interrupt structure types */
1478
1479 Temp8 = *Target;
1480 if (Temp8 > ACPI_AEST_XRUPT_RESERVED)
1481 {
1482 Temp8 = ACPI_AEST_XRUPT_RESERVED;
1483 }
1484
1485 AcpiOsPrintf (UINT8_FORMAT, *Target,
1486 AcpiDmAestXruptNames[Temp8]);
1487 break;
1488
1489 case ACPI_DMT_ASF:
1490
1491 /* ASF subtable types */
1492
1493 Temp16 = (UINT16) ((*Target) & 0x7F); /* Top bit can be zero or one */
1494 if (Temp16 > ACPI_ASF_TYPE_RESERVED)
1495 {
1496 Temp16 = ACPI_ASF_TYPE_RESERVED;
1497 }
1498
1499 AcpiOsPrintf (UINT8_FORMAT, *Target, AcpiDmAsfSubnames[Temp16]);
1500 break;
1501
1502 case ACPI_DMT_CEDT:
1503
1504 /* CEDT subtable types */
1505
1506 Temp8 = *Target;
1507 if (Temp8 > ACPI_CEDT_TYPE_RESERVED)
1508 {
1509 Temp8 = ACPI_CEDT_TYPE_RESERVED;
1510 }
1511
1512 AcpiOsPrintf (UINT8_FORMAT, *Target,
1513 AcpiDmCedtSubnames[Temp8]);
1514 break;
1515
1516 case ACPI_DMT_DMAR:
1517
1518 /* DMAR subtable types */
1519
1520 Temp16 = ACPI_GET16 (Target);
1521 if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
1522 {
1523 Temp16 = ACPI_DMAR_TYPE_RESERVED;
1524 }
1525
1526 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1527 AcpiDmDmarSubnames[Temp16]);
1528 break;
1529
1530 case ACPI_DMT_DMAR_SCOPE:
1531
1532 /* DMAR device scope types */
1533
1534 Temp8 = *Target;
1535 if (Temp8 > ACPI_DMAR_SCOPE_TYPE_RESERVED)
1536 {
1537 Temp8 = ACPI_DMAR_SCOPE_TYPE_RESERVED;
1538 }
1539
1540 AcpiOsPrintf (UINT8_FORMAT, *Target,
1541 AcpiDmDmarScope[Temp8]);
1542 break;
1543
1544 case ACPI_DMT_EINJACT:
1545
1546 /* EINJ Action types */
1547
1548 Temp8 = *Target;
1549 if (Temp8 > ACPI_EINJ_ACTION_RESERVED)
1550 {
1551 Temp8 = ACPI_EINJ_ACTION_RESERVED;
1552 }
1553
1554 AcpiOsPrintf (UINT8_FORMAT, *Target,
1555 AcpiDmEinjActions[Temp8]);
1556 break;
1557
1558 case ACPI_DMT_EINJINST:
1559
1560 /* EINJ Instruction types */
1561
1562 Temp8 = *Target;
1563 if (Temp8 > ACPI_EINJ_INSTRUCTION_RESERVED)
1564 {
1565 Temp8 = ACPI_EINJ_INSTRUCTION_RESERVED;
1566 }
1567
1568 AcpiOsPrintf (UINT8_FORMAT, *Target,
1569 AcpiDmEinjInstructions[Temp8]);
1570 break;
1571
1572 case ACPI_DMT_ERSTACT:
1573
1574 /* ERST Action types */
1575
1576 Temp8 = *Target;
1577 if (Temp8 > ACPI_ERST_ACTION_RESERVED)
1578 {
1579 Temp8 = ACPI_ERST_ACTION_RESERVED;
1580 }
1581
1582 AcpiOsPrintf (UINT8_FORMAT, *Target,
1583 AcpiDmErstActions[Temp8]);
1584 break;
1585
1586 case ACPI_DMT_ERSTINST:
1587
1588 /* ERST Instruction types */
1589
1590 Temp8 = *Target;
1591 if (Temp8 > ACPI_ERST_INSTRUCTION_RESERVED)
1592 {
1593 Temp8 = ACPI_ERST_INSTRUCTION_RESERVED;
1594 }
1595
1596 AcpiOsPrintf (UINT8_FORMAT, *Target,
1597 AcpiDmErstInstructions[Temp8]);
1598 break;
1599
1600 case ACPI_DMT_GTDT:
1601
1602 /* GTDT subtable types */
1603
1604 Temp8 = *Target;
1605 if (Temp8 > ACPI_GTDT_TYPE_RESERVED)
1606 {
1607 Temp8 = ACPI_GTDT_TYPE_RESERVED;
1608 }
1609
1610 AcpiOsPrintf (UINT8_FORMAT, *Target,
1611 AcpiDmGtdtSubnames[Temp8]);
1612 break;
1613
1614 case ACPI_DMT_HEST:
1615
1616 /* HEST subtable types */
1617
1618 Temp16 = ACPI_GET16 (Target);
1619 if (Temp16 > ACPI_HEST_TYPE_RESERVED)
1620 {
1621 Temp16 = ACPI_HEST_TYPE_RESERVED;
1622 }
1623
1624 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1625 AcpiDmHestSubnames[Temp16]);
1626 break;
1627
1628 case ACPI_DMT_HESTNTFY:
1629
1630 AcpiOsPrintf (STRING_FORMAT,
1631 "Hardware Error Notification Structure");
1632
1633 Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1634 sizeof (ACPI_HEST_NOTIFY), AcpiDmTableInfoHestNotify);
1635 if (ACPI_FAILURE (Status))
1636 {
1637 return (Status);
1638 }
1639
1640 AcpiOsPrintf ("\n");
1641 LastOutputBlankLine = TRUE;
1642 break;
1643
1644 case ACPI_DMT_HESTNTYP:
1645
1646 /* HEST Notify types */
1647
1648 Temp8 = *Target;
1649 if (Temp8 > ACPI_HEST_NOTIFY_RESERVED)
1650 {
1651 Temp8 = ACPI_HEST_NOTIFY_RESERVED;
1652 }
1653
1654 AcpiOsPrintf (UINT8_FORMAT, *Target,
1655 AcpiDmHestNotifySubnames[Temp8]);
1656 break;
1657
1658 case ACPI_DMT_HMAT:
1659
1660 /* HMAT subtable types */
1661
1662 Temp16 = *Target;
1663 if (Temp16 > ACPI_HMAT_TYPE_RESERVED)
1664 {
1665 Temp16 = ACPI_HMAT_TYPE_RESERVED;
1666 }
1667
1668 AcpiOsPrintf (UINT16_FORMAT, *Target,
1669 AcpiDmHmatSubnames[Temp16]);
1670 break;
1671
1672 case ACPI_DMT_IORTMEM:
1673
1674 AcpiOsPrintf (STRING_FORMAT,
1675 "IORT Memory Access Properties");
1676
1677 Status = AcpiDmDumpTable (TableLength, CurrentOffset, Target,
1678 sizeof (ACPI_IORT_MEMORY_ACCESS), AcpiDmTableInfoIortAcc);
1679 if (ACPI_FAILURE (Status))
1680 {
1681 return (Status);
1682 }
1683
1684 LastOutputBlankLine = TRUE;
1685 break;
1686
1687 case ACPI_DMT_MADT:
1688
1689 /* MADT subtable types */
1690
1691 Temp8 = *Target;
1692 if (Temp8 > ACPI_MADT_TYPE_RESERVED)
1693 {
1694 Temp8 = ACPI_MADT_TYPE_RESERVED;
1695 }
1696
1697 AcpiOsPrintf (UINT8_FORMAT, *Target,
1698 AcpiDmMadtSubnames[Temp8]);
1699 break;
1700
1701 case ACPI_DMT_NFIT:
1702
1703 /* NFIT subtable types */
1704
1705 Temp16 = ACPI_GET16 (Target);
1706 if (Temp16 > ACPI_NFIT_TYPE_RESERVED)
1707 {
1708 Temp16 = ACPI_NFIT_TYPE_RESERVED;
1709 }
1710
1711 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16 (Target),
1712 AcpiDmNfitSubnames[Temp16]);
1713 break;
1714
1715 case ACPI_DMT_NHLT1:
1716
1717 /* NHLT link types */
1718
1719 Temp8 = *Target;
1720 if (Temp8 > ACPI_NHLT_TYPE_RESERVED)
1721 {
1722 Temp8 = ACPI_NHLT_TYPE_RESERVED;
1723 }
1724
1725 AcpiOsPrintf (UINT8_FORMAT, *Target,
1726 AcpiDmNhltLinkTypeNames[Temp8]);
1727 break;
1728
1729 case ACPI_DMT_NHLT1a:
1730
1731 /* NHLT direction */
1732
1733 Temp8 = *Target;
1734 if (Temp8 > ACPI_NHLT_DIR_RESERVED)
1735 {
1736 Temp8 = ACPI_NHLT_DIR_RESERVED;
1737 }
1738
1739 AcpiOsPrintf (UINT8_FORMAT, *Target,
1740 AcpiDmNhltDirectionNames[Temp8]);
1741 break;
1742
1743 case ACPI_DMT_PCCT:
1744
1745 /* PCCT subtable types */
1746
1747 Temp8 = *Target;
1748 if (Temp8 > ACPI_PCCT_TYPE_RESERVED)
1749 {
1750 Temp8 = ACPI_PCCT_TYPE_RESERVED;
1751 }
1752
1753 AcpiOsPrintf (UINT8_FORMAT, *Target,
1754 AcpiDmPcctSubnames[Temp8]);
1755 break;
1756
1757 case ACPI_DMT_PHAT:
1758
1759 /* PMTT subtable types */
1760
1761 Temp16 = *Target;
1762 if (Temp16 > ACPI_PHAT_TYPE_RESERVED)
1763 {
1764 Temp16 = ACPI_PHAT_TYPE_RESERVED;
1765 }
1766
1767 AcpiOsPrintf (UINT16_FORMAT, ACPI_GET16(Target),
1768 AcpiDmPhatSubnames[Temp16]);
1769 break;
1770
1771 case ACPI_DMT_PMTT:
1772
1773 /* PMTT subtable types */
1774
1775 Temp8 = *Target;
1776 if (Temp8 == ACPI_PMTT_TYPE_VENDOR)
1777 {
1778 Temp8 = ACPI_PMTT_TYPE_RESERVED + 1;
1779 }
1780 else if (Temp8 > ACPI_PMTT_TYPE_RESERVED)
1781 {
1782 Temp8 = ACPI_PMTT_TYPE_RESERVED;
1783 }
1784 AcpiOsPrintf (UINT8_FORMAT, *Target,
1785 AcpiDmPmttSubnames[Temp8]);
1786 break;
1787
1788 case ACPI_DMT_PPTT:
1789
1790 /* PPTT subtable types */
1791
1792 Temp8 = *Target;
1793 if (Temp8 > ACPI_PPTT_TYPE_RESERVED)
1794 {
1795 Temp8 = ACPI_PPTT_TYPE_RESERVED;
1796 }
1797
1798 AcpiOsPrintf (UINT8_FORMAT, *Target,
1799 AcpiDmPpttSubnames[Temp8]);
1800 break;
1801
1802 case ACPI_DMT_UNICODE:
1803 case ACPI_DMT_WPBT_UNICODE:
1804
1805 if (ByteLength == 0)
1806 {
1807 AcpiOsPrintf ("/* Zero-length Data */\n");
1808 break;
1809 }
1810
1811 AcpiDmDumpUnicode (Table, CurrentOffset, ByteLength);
1812 break;
1813
1814 case ACPI_DMT_RAW_BUFFER:
1815 case ACPI_DMT_BUFFER:
1816 case ACPI_DMT_PMTT_VENDOR:
1817
1818 if (ByteLength == 0)
1819 {
1820 AcpiOsPrintf ("/* Zero-length Data */\n");
1821 break;
1822 }
1823
1824 AcpiDmDumpBuffer (Target, 0, ByteLength, 0, NULL);
1825 break;
1826
1827 case ACPI_DMT_RGRT:
1828
1829 /* RGRT subtable types */
1830
1831 Temp8 = *Target;
1832 if (Temp8 >= ACPI_RGRT_TYPE_RESERVED)
1833 {
1834 Temp8 = ACPI_RGRT_TYPE_RESERVED0;
1835 }
1836
1837 AcpiOsPrintf (UINT8_FORMAT, *Target,
1838 AcpiDmRgrtSubnames[Temp8]);
1839 break;
1840
1841 case ACPI_DMT_SDEV:
1842
1843 /* SDEV subtable types */
1844
1845 Temp8 = *Target;
1846 if (Temp8 > ACPI_SDEV_TYPE_RESERVED)
1847 {
1848 Temp8 = ACPI_SDEV_TYPE_RESERVED;
1849 }
1850
1851 AcpiOsPrintf (UINT8_FORMAT, *Target,
1852 AcpiDmSdevSubnames[Temp8]);
1853 break;
1854
1855 case ACPI_DMT_SRAT:
1856
1857 /* SRAT subtable types */
1858
1859 Temp8 = *Target;
1860 if (Temp8 > ACPI_SRAT_TYPE_RESERVED)
1861 {
1862 Temp8 = ACPI_SRAT_TYPE_RESERVED;
1863 }
1864
1865 AcpiOsPrintf (UINT8_FORMAT, *Target,
1866 AcpiDmSratSubnames[Temp8]);
1867 break;
1868
1869 case ACPI_DMT_TPM2:
1870
1871 /* TPM2 Start Method types */
1872
1873 Temp8 = *Target;
1874 if (Temp8 > ACPI_TPM2_RESERVED)
1875 {
1876 Temp8 = ACPI_TPM2_RESERVED;
1877 }
1878
1879 AcpiOsPrintf (UINT8_FORMAT, *Target,
1880 AcpiDmTpm2Subnames[Temp8]);
1881 break;
1882
1883
1884 case ACPI_DMT_FADTPM:
1885
1886 /* FADT Preferred PM Profile names */
1887
1888 Temp8 = *Target;
1889 if (Temp8 > ACPI_FADT_PM_RESERVED)
1890 {
1891 Temp8 = ACPI_FADT_PM_RESERVED;
1892 }
1893
1894 AcpiOsPrintf (UINT8_FORMAT, *Target,
1895 AcpiDmFadtProfiles[Temp8]);
1896 break;
1897
1898 case ACPI_DMT_IVRS:
1899
1900 /* IVRS subtable types */
1901
1902 Temp8 = *Target;
1903 switch (Temp8)
1904 {
1905 case ACPI_IVRS_TYPE_HARDWARE1:
1906 case ACPI_IVRS_TYPE_HARDWARE2:
1907
1908 Name = AcpiDmIvrsSubnames[0];
1909 break;
1910
1911 case ACPI_IVRS_TYPE_HARDWARE3:
1912
1913 Name = AcpiDmIvrsSubnames[1];
1914 break;
1915
1916 case ACPI_IVRS_TYPE_MEMORY1:
1917 case ACPI_IVRS_TYPE_MEMORY2:
1918 case ACPI_IVRS_TYPE_MEMORY3:
1919
1920 Name = AcpiDmIvrsSubnames[2];
1921 break;
1922
1923 default:
1924
1925 Name = AcpiDmIvrsSubnames[3];
1926 break;
1927 }
1928
1929 AcpiOsPrintf (UINT8_FORMAT, *Target, Name);
1930 break;
1931
1932 case ACPI_DMT_IVRS_DE:
1933
1934 /* IVRS device entry types */
1935
1936 Temp8 = *Target;
1937 switch (Temp8)
1938 {
1939 case ACPI_IVRS_TYPE_ALL:
1940 case ACPI_IVRS_TYPE_SELECT:
1941 case ACPI_IVRS_TYPE_START:
1942 case ACPI_IVRS_TYPE_END:
1943
1944 Name = AcpiDmIvrsDevEntryNames[Temp8];
1945 break;
1946
1947 case ACPI_IVRS_TYPE_ALIAS_SELECT:
1948 case ACPI_IVRS_TYPE_ALIAS_START:
1949 case ACPI_IVRS_TYPE_EXT_SELECT:
1950 case ACPI_IVRS_TYPE_EXT_START:
1951 case ACPI_IVRS_TYPE_SPECIAL:
1952
1953 Name = AcpiDmIvrsDevEntryNames[Temp8 - 61];
1954 break;
1955
1956 case ACPI_IVRS_TYPE_HID:
1957
1958 Name = AcpiDmIvrsDevEntryNames[Temp8 - 228];
1959 break;
1960
1961 default:
1962 Name = AcpiDmIvrsDevEntryNames[0]; /* Unknown/Reserved */
1963 break;
1964 }
1965
1966 AcpiOsPrintf (UINT8_FORMAT, *Target, Name);
1967 break;
1968
1969 case ACPI_DMT_LPIT:
1970
1971 /* LPIT subtable types */
1972
1973 Temp32 = ACPI_GET32 (Target);
1974 if (Temp32 > ACPI_LPIT_TYPE_RESERVED)
1975 {
1976 Temp32 = ACPI_LPIT_TYPE_RESERVED;
1977 }
1978
1979 AcpiOsPrintf (UINT32_FORMAT, ACPI_GET32 (Target),
1980 AcpiDmLpitSubnames[Temp32]);
1981 break;
1982
1983 case ACPI_DMT_VIOT:
1984
1985 /* VIOT subtable types */
1986
1987 Temp8 = *Target;
1988 if (Temp8 > ACPI_VIOT_RESERVED)
1989 {
1990 Temp8 = ACPI_VIOT_RESERVED;
1991 }
1992
1993 AcpiOsPrintf (UINT8_FORMAT, *Target,
1994 AcpiDmViotSubnames[Temp8]);
1995 break;
1996
1997 case ACPI_DMT_EXIT:
1998
1999 return (AE_OK);
2000
2001 default:
2002
2003 ACPI_ERROR ((AE_INFO,
2004 "**** Invalid table opcode [0x%X] ****\n", Info->Opcode));
2005 return (AE_SUPPORT);
2006 }
2007 }
2008
2009 if (TableOffset && !SubtableLength)
2010 {
2011 /*
2012 * If this table is not the main table, the subtable must have a
2013 * valid length
2014 */
2015 AcpiOsPrintf ("Invalid zero length subtable\n");
2016 return (AE_BAD_DATA);
2017 }
2018
2019 return (AE_OK);
2020 }
2021