dmtbdump3.c revision 1.1.1.2 1 /******************************************************************************
2 *
3 * Module Name: dmtbdump3 - Dump ACPI data tables that contain no AML code
4 *
5 *****************************************************************************/
6
7 /*
8 * Copyright (C) 2000 - 2018, 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
49 /* This module used for application-level code only */
50
51 #define _COMPONENT ACPI_CA_DISASSEMBLER
52 ACPI_MODULE_NAME ("dmtbdump3")
53
54
55 /*******************************************************************************
56 *
57 * FUNCTION: AcpiDmDumpSlic
58 *
59 * PARAMETERS: Table - A SLIC table
60 *
61 * RETURN: None
62 *
63 * DESCRIPTION: Format the contents of a SLIC
64 *
65 ******************************************************************************/
66
67 void
68 AcpiDmDumpSlic (
69 ACPI_TABLE_HEADER *Table)
70 {
71
72 (void) AcpiDmDumpTable (Table->Length, sizeof (ACPI_TABLE_HEADER), Table,
73 Table->Length - sizeof (*Table), AcpiDmTableInfoSlic);
74 }
75
76
77 /*******************************************************************************
78 *
79 * FUNCTION: AcpiDmDumpSlit
80 *
81 * PARAMETERS: Table - An SLIT
82 *
83 * RETURN: None
84 *
85 * DESCRIPTION: Format the contents of a SLIT
86 *
87 ******************************************************************************/
88
89 void
90 AcpiDmDumpSlit (
91 ACPI_TABLE_HEADER *Table)
92 {
93 ACPI_STATUS Status;
94 UINT32 Offset;
95 UINT8 *Row;
96 UINT32 Localities;
97 UINT32 i;
98 UINT32 j;
99
100
101 /* Main table */
102
103 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit);
104 if (ACPI_FAILURE (Status))
105 {
106 return;
107 }
108
109 /* Display the Locality NxN Matrix */
110
111 Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount;
112 Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]);
113 Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry;
114
115 for (i = 0; i < Localities; i++)
116 {
117 /* Display one row of the matrix */
118
119 AcpiDmLineHeader2 (Offset, Localities, "Locality", i);
120 for (j = 0; j < Localities; j++)
121 {
122 /* Check for beyond EOT */
123
124 if (Offset >= Table->Length)
125 {
126 AcpiOsPrintf (
127 "\n**** Not enough room in table for all localities\n");
128 return;
129 }
130
131 AcpiOsPrintf ("%2.2X", Row[j]);
132 Offset++;
133
134 /* Display up to 16 bytes per output row */
135
136 if ((j+1) < Localities)
137 {
138 AcpiOsPrintf (" ");
139
140 if (j && (((j+1) % 16) == 0))
141 {
142 AcpiOsPrintf ("\\\n"); /* With line continuation char */
143 AcpiDmLineHeader (Offset, 0, NULL);
144 }
145 }
146 }
147
148 /* Point to next row */
149
150 AcpiOsPrintf ("\n");
151 Row += Localities;
152 }
153 }
154
155
156 /*******************************************************************************
157 *
158 * FUNCTION: AcpiDmDumpSrat
159 *
160 * PARAMETERS: Table - A SRAT table
161 *
162 * RETURN: None
163 *
164 * DESCRIPTION: Format the contents of a SRAT
165 *
166 ******************************************************************************/
167
168 void
169 AcpiDmDumpSrat (
170 ACPI_TABLE_HEADER *Table)
171 {
172 ACPI_STATUS Status;
173 UINT32 Offset = sizeof (ACPI_TABLE_SRAT);
174 ACPI_SUBTABLE_HEADER *Subtable;
175 ACPI_DMTABLE_INFO *InfoTable;
176
177
178 /* Main table */
179
180 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat);
181 if (ACPI_FAILURE (Status))
182 {
183 return;
184 }
185
186 /* Subtables */
187
188 Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
189 while (Offset < Table->Length)
190 {
191 /* Common subtable header */
192
193 AcpiOsPrintf ("\n");
194 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
195 Subtable->Length, AcpiDmTableInfoSratHdr);
196 if (ACPI_FAILURE (Status))
197 {
198 return;
199 }
200
201 switch (Subtable->Type)
202 {
203 case ACPI_SRAT_TYPE_CPU_AFFINITY:
204
205 InfoTable = AcpiDmTableInfoSrat0;
206 break;
207
208 case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
209
210 InfoTable = AcpiDmTableInfoSrat1;
211 break;
212
213 case ACPI_SRAT_TYPE_X2APIC_CPU_AFFINITY:
214
215 InfoTable = AcpiDmTableInfoSrat2;
216 break;
217
218 case ACPI_SRAT_TYPE_GICC_AFFINITY:
219
220 InfoTable = AcpiDmTableInfoSrat3;
221 break;
222
223 case ACPI_SRAT_TYPE_GIC_ITS_AFFINITY:
224
225 InfoTable = AcpiDmTableInfoSrat4;
226 break;
227
228 default:
229 AcpiOsPrintf ("\n**** Unknown SRAT subtable type 0x%X\n",
230 Subtable->Type);
231
232 /* Attempt to continue */
233
234 if (!Subtable->Length)
235 {
236 AcpiOsPrintf ("Invalid zero length subtable\n");
237 return;
238 }
239 goto NextSubtable;
240 }
241
242 AcpiOsPrintf ("\n");
243 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
244 Subtable->Length, InfoTable);
245 if (ACPI_FAILURE (Status))
246 {
247 return;
248 }
249
250 NextSubtable:
251 /* Point to next subtable */
252
253 Offset += Subtable->Length;
254 Subtable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Subtable,
255 Subtable->Length);
256 }
257 }
258
259
260 /*******************************************************************************
261 *
262 * FUNCTION: AcpiDmDumpStao
263 *
264 * PARAMETERS: Table - A STAO table
265 *
266 * RETURN: None
267 *
268 * DESCRIPTION: Format the contents of a STAO. This is a variable-length
269 * table that contains an open-ended number of ASCII strings
270 * at the end of the table.
271 *
272 ******************************************************************************/
273
274 void
275 AcpiDmDumpStao (
276 ACPI_TABLE_HEADER *Table)
277 {
278 ACPI_STATUS Status;
279 char *Namepath;
280 UINT32 Length = Table->Length;
281 UINT32 StringLength;
282 UINT32 Offset = sizeof (ACPI_TABLE_STAO);
283
284
285 /* Main table */
286
287 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoStao);
288 if (ACPI_FAILURE (Status))
289 {
290 return;
291 }
292
293 /* The rest of the table consists of Namepath strings */
294
295 while (Offset < Table->Length)
296 {
297 Namepath = ACPI_ADD_PTR (char, Table, Offset);
298 StringLength = strlen (Namepath) + 1;
299
300 AcpiDmLineHeader (Offset, StringLength, "Namestring");
301 AcpiOsPrintf ("\"%s\"\n", Namepath);
302
303 /* Point to next namepath */
304
305 Offset += StringLength;
306 }
307 }
308
309
310 /*******************************************************************************
311 *
312 * FUNCTION: AcpiDmDumpTcpa
313 *
314 * PARAMETERS: Table - A TCPA table
315 *
316 * RETURN: None
317 *
318 * DESCRIPTION: Format the contents of a TCPA.
319 *
320 * NOTE: There are two versions of the table with the same signature:
321 * the client version and the server version. The common
322 * PlatformClass field is used to differentiate the two types of
323 * tables.
324 *
325 ******************************************************************************/
326
327 void
328 AcpiDmDumpTcpa (
329 ACPI_TABLE_HEADER *Table)
330 {
331 UINT32 Offset = sizeof (ACPI_TABLE_TCPA_HDR);
332 ACPI_TABLE_TCPA_HDR *CommonHeader = ACPI_CAST_PTR (
333 ACPI_TABLE_TCPA_HDR, Table);
334 ACPI_TABLE_TCPA_HDR *Subtable = ACPI_ADD_PTR (
335 ACPI_TABLE_TCPA_HDR, Table, Offset);
336 ACPI_STATUS Status;
337
338
339 /* Main table */
340
341 Status = AcpiDmDumpTable (Table->Length, 0, Table,
342 0, AcpiDmTableInfoTcpaHdr);
343 if (ACPI_FAILURE (Status))
344 {
345 return;
346 }
347
348 /*
349 * Examine the PlatformClass field to determine the table type.
350 * Either a client or server table. Only one.
351 */
352 switch (CommonHeader->PlatformClass)
353 {
354 case ACPI_TCPA_CLIENT_TABLE:
355
356 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
357 Table->Length - Offset, AcpiDmTableInfoTcpaClient);
358 break;
359
360 case ACPI_TCPA_SERVER_TABLE:
361
362 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
363 Table->Length - Offset, AcpiDmTableInfoTcpaServer);
364 break;
365
366 default:
367
368 AcpiOsPrintf ("\n**** Unknown TCPA Platform Class 0x%X\n",
369 CommonHeader->PlatformClass);
370 Status = AE_ERROR;
371 break;
372 }
373
374 if (ACPI_FAILURE (Status))
375 {
376 AcpiOsPrintf ("\n**** Cannot disassemble TCPA table\n");
377 }
378 }
379
380
381 /*******************************************************************************
382 *
383 * FUNCTION: AcpiDmDumpTpm2
384 *
385 * PARAMETERS: Table - A TPM2 table
386 *
387 * RETURN: None
388 *
389 * DESCRIPTION: Format the contents of a TPM2.
390 *
391 ******************************************************************************/
392 static void
393 AcpiDmDumpTpm2Rev3 (
394 ACPI_TABLE_HEADER *Table)
395 {
396 UINT32 Offset = sizeof (ACPI_TABLE_TPM23);
397 ACPI_TABLE_TPM23 *CommonHeader = ACPI_CAST_PTR (ACPI_TABLE_TPM23, Table);
398 ACPI_TPM23_TRAILER *Subtable = ACPI_ADD_PTR (ACPI_TPM23_TRAILER, Table, Offset);
399 ACPI_STATUS Status;
400
401
402 /* Main table */
403
404 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoTpm23);
405 if (ACPI_FAILURE (Status))
406 {
407 return;
408 }
409
410 /* Optional subtable if start method is ACPI start method */
411
412 switch (CommonHeader->StartMethod)
413 {
414 case ACPI_TPM23_ACPI_START_METHOD:
415
416 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
417 Table->Length - Offset, AcpiDmTableInfoTpm23a);
418 break;
419
420 default:
421 break;
422 }
423 }
424
425
426 /*******************************************************************************
427 *
428 * FUNCTION: AcpiDmDumpTpm2
429 *
430 * PARAMETERS: Table - A TPM2 table
431 *
432 * RETURN: None
433 *
434 * DESCRIPTION: Format the contents of a TPM2.
435 *
436 ******************************************************************************/
437
438 void
439 AcpiDmDumpTpm2 (
440 ACPI_TABLE_HEADER *Table)
441 {
442 UINT32 Offset = sizeof (ACPI_TABLE_TPM2);
443 ACPI_TABLE_TPM2 *CommonHeader = ACPI_CAST_PTR (ACPI_TABLE_TPM2, Table);
444 ACPI_TPM2_TRAILER *Subtable = ACPI_ADD_PTR (ACPI_TPM2_TRAILER, Table, Offset);
445 ACPI_TPM2_ARM_SMC *ArmSubtable;
446 ACPI_STATUS Status;
447
448
449 if (Table->Revision == 3)
450 {
451 AcpiDmDumpTpm2Rev3(Table);
452 return;
453 }
454
455 /* Main table */
456
457 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoTpm2);
458
459 if (ACPI_FAILURE (Status))
460 {
461 return;
462 }
463
464 AcpiOsPrintf ("\n");
465 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
466 Table->Length - Offset, AcpiDmTableInfoTpm2a);
467 if (ACPI_FAILURE (Status))
468 {
469 return;
470 }
471
472 switch (CommonHeader->StartMethod)
473 {
474 case ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC:
475
476 ArmSubtable = ACPI_ADD_PTR (ACPI_TPM2_ARM_SMC, Subtable,
477 sizeof (ACPI_TPM2_TRAILER));
478 Offset += sizeof (ACPI_TPM2_TRAILER);
479
480 AcpiOsPrintf ("\n");
481 Status = AcpiDmDumpTable (Table->Length, Offset, ArmSubtable,
482 Table->Length - Offset, AcpiDmTableInfoTpm211);
483 break;
484
485 default:
486 break;
487 }
488 }
489
490
491 /*******************************************************************************
492 *
493 * FUNCTION: AcpiDmDumpVrtc
494 *
495 * PARAMETERS: Table - A VRTC table
496 *
497 * RETURN: None
498 *
499 * DESCRIPTION: Format the contents of a VRTC
500 *
501 ******************************************************************************/
502
503 void
504 AcpiDmDumpVrtc (
505 ACPI_TABLE_HEADER *Table)
506 {
507 ACPI_STATUS Status;
508 UINT32 Offset = sizeof (ACPI_TABLE_VRTC);
509 ACPI_VRTC_ENTRY *Subtable;
510
511
512 /* Main table */
513
514 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoVrtc);
515 if (ACPI_FAILURE (Status))
516 {
517 return;
518 }
519
520 /* Subtables */
521
522 Subtable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Table, Offset);
523 while (Offset < Table->Length)
524 {
525 /* Common subtable header */
526
527 AcpiOsPrintf ("\n");
528 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
529 sizeof (ACPI_VRTC_ENTRY), AcpiDmTableInfoVrtc0);
530 if (ACPI_FAILURE (Status))
531 {
532 return;
533 }
534
535 /* Point to next subtable */
536
537 Offset += sizeof (ACPI_VRTC_ENTRY);
538 Subtable = ACPI_ADD_PTR (ACPI_VRTC_ENTRY, Subtable,
539 sizeof (ACPI_VRTC_ENTRY));
540 }
541 }
542
543
544 /*******************************************************************************
545 *
546 * FUNCTION: AcpiDmDumpWdat
547 *
548 * PARAMETERS: Table - A WDAT table
549 *
550 * RETURN: None
551 *
552 * DESCRIPTION: Format the contents of a WDAT
553 *
554 ******************************************************************************/
555
556 void
557 AcpiDmDumpWdat (
558 ACPI_TABLE_HEADER *Table)
559 {
560 ACPI_STATUS Status;
561 UINT32 Offset = sizeof (ACPI_TABLE_WDAT);
562 ACPI_WDAT_ENTRY *Subtable;
563
564
565 /* Main table */
566
567 Status = AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoWdat);
568 if (ACPI_FAILURE (Status))
569 {
570 return;
571 }
572
573 /* Subtables */
574
575 Subtable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Table, Offset);
576 while (Offset < Table->Length)
577 {
578 /* Common subtable header */
579
580 AcpiOsPrintf ("\n");
581 Status = AcpiDmDumpTable (Table->Length, Offset, Subtable,
582 sizeof (ACPI_WDAT_ENTRY), AcpiDmTableInfoWdat0);
583 if (ACPI_FAILURE (Status))
584 {
585 return;
586 }
587
588 /* Point to next subtable */
589
590 Offset += sizeof (ACPI_WDAT_ENTRY);
591 Subtable = ACPI_ADD_PTR (ACPI_WDAT_ENTRY, Subtable,
592 sizeof (ACPI_WDAT_ENTRY));
593 }
594 }
595
596
597 /*******************************************************************************
598 *
599 * FUNCTION: AcpiDmDumpWpbt
600 *
601 * PARAMETERS: Table - A WPBT table
602 *
603 * RETURN: None
604 *
605 * DESCRIPTION: Format the contents of a WPBT. This table type consists
606 * of an open-ended arguments buffer at the end of the table.
607 *
608 ******************************************************************************/
609
610 void
611 AcpiDmDumpWpbt (
612 ACPI_TABLE_HEADER *Table)
613 {
614 ACPI_STATUS Status;
615 ACPI_TABLE_WPBT *Subtable;
616 UINT32 Length = Table->Length;
617 UINT16 ArgumentsLength;
618
619
620 /* Dump the main table */
621
622 Status = AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoWpbt);
623 if (ACPI_FAILURE (Status))
624 {
625 return;
626 }
627
628 /* Extract the arguments buffer length from the main table */
629
630 Subtable = ACPI_CAST_PTR (ACPI_TABLE_WPBT, Table);
631 ArgumentsLength = Subtable->ArgumentsLength;
632
633 /* Dump the arguments buffer */
634
635 (void) AcpiDmDumpTable (Table->Length, 0, Table, ArgumentsLength,
636 AcpiDmTableInfoWpbt0);
637 }
638