dmtable.c revision 167803
1/******************************************************************************
2 *
3 * Module Name: dmtable - Support for ACPI tables that contain no AML code
4 *              $Revision: 1.12 $
5 *
6 *****************************************************************************/
7
8/******************************************************************************
9 *
10 * 1. Copyright Notice
11 *
12 * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
13 * All rights reserved.
14 *
15 * 2. License
16 *
17 * 2.1. This is your license from Intel Corp. under its intellectual property
18 * rights.  You may have additional license terms from the party that provided
19 * you this software, covering your right to use that party's intellectual
20 * property rights.
21 *
22 * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
23 * copy of the source code appearing in this file ("Covered Code") an
24 * irrevocable, perpetual, worldwide license under Intel's copyrights in the
25 * base code distributed originally by Intel ("Original Intel Code") to copy,
26 * make derivatives, distribute, use and display any portion of the Covered
27 * Code in any form, with the right to sublicense such rights; and
28 *
29 * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
30 * license (with the right to sublicense), under only those claims of Intel
31 * patents that are infringed by the Original Intel Code, to make, use, sell,
32 * offer to sell, and import the Covered Code and derivative works thereof
33 * solely to the minimum extent necessary to exercise the above copyright
34 * license, and in no event shall the patent license extend to any additions
35 * to or modifications of the Original Intel Code.  No other license or right
36 * is granted directly or by implication, estoppel or otherwise;
37 *
38 * The above copyright and patent license is granted only if the following
39 * conditions are met:
40 *
41 * 3. Conditions
42 *
43 * 3.1. Redistribution of Source with Rights to Further Distribute Source.
44 * Redistribution of source code of any substantial portion of the Covered
45 * Code or modification with rights to further distribute source must include
46 * the above Copyright Notice, the above License, this list of Conditions,
47 * and the following Disclaimer and Export Compliance provision.  In addition,
48 * Licensee must cause all Covered Code to which Licensee contributes to
49 * contain a file documenting the changes Licensee made to create that Covered
50 * Code and the date of any change.  Licensee must include in that file the
51 * documentation of any changes made by any predecessor Licensee.  Licensee
52 * must include a prominent statement that the modification is derived,
53 * directly or indirectly, from Original Intel Code.
54 *
55 * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
56 * Redistribution of source code of any substantial portion of the Covered
57 * Code or modification without rights to further distribute source must
58 * include the following Disclaimer and Export Compliance provision in the
59 * documentation and/or other materials provided with distribution.  In
60 * addition, Licensee may not authorize further sublicense of source of any
61 * portion of the Covered Code, and must include terms to the effect that the
62 * license from Licensee to its licensee is limited to the intellectual
63 * property embodied in the software Licensee provides to its licensee, and
64 * not to intellectual property embodied in modifications its licensee may
65 * make.
66 *
67 * 3.3. Redistribution of Executable. Redistribution in executable form of any
68 * substantial portion of the Covered Code or modification must reproduce the
69 * above Copyright Notice, and the following Disclaimer and Export Compliance
70 * provision in the documentation and/or other materials provided with the
71 * distribution.
72 *
73 * 3.4. Intel retains all right, title, and interest in and to the Original
74 * Intel Code.
75 *
76 * 3.5. Neither the name Intel nor any other trademark owned or controlled by
77 * Intel shall be used in advertising or otherwise to promote the sale, use or
78 * other dealings in products derived from or relating to the Covered Code
79 * without prior written authorization from Intel.
80 *
81 * 4. Disclaimer and Export Compliance
82 *
83 * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
84 * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
85 * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
86 * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
87 * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
88 * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
89 * PARTICULAR PURPOSE.
90 *
91 * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
92 * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
93 * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
94 * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
95 * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
96 * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
97 * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
98 * LIMITED REMEDY.
99 *
100 * 4.3. Licensee shall not export, either directly or indirectly, any of this
101 * software or system incorporating such software without first obtaining any
102 * required license or other approval from the U. S. Department of Commerce or
103 * any other agency or department of the United States Government.  In the
104 * event Licensee exports any such software from the United States or
105 * re-exports any such software from a foreign destination, Licensee shall
106 * ensure that the distribution and export/re-export of the software is in
107 * compliance with all laws, regulations, orders, or other restrictions of the
108 * U.S. Export Administration Regulations. Licensee agrees that neither it nor
109 * any of its subsidiaries will export/re-export any technical data, process,
110 * software, or service, directly or indirectly, to any country for which the
111 * United States government or any agency thereof requires an export license,
112 * other governmental approval, or letter of assurance, without first obtaining
113 * such license, approval or letter.
114 *
115 *****************************************************************************/
116
117#include <contrib/dev/acpica/acpi.h>
118#include <contrib/dev/acpica/acdisasm.h>
119#include <contrib/dev/acpica/actables.h>
120
121/* This module used for application-level code only */
122
123#define _COMPONENT          ACPI_CA_DISASSEMBLER
124        ACPI_MODULE_NAME    ("dmtable")
125
126/* Local Prototypes */
127
128static ACPI_DMTABLE_DATA *
129AcpiDmGetTableData (
130    char                    *Signature);
131
132static void
133AcpiDmCheckAscii (
134    UINT8                   *Target,
135    UINT32                  Count);
136
137
138/* These tables map a subtable type to a description string */
139
140static const char           *AcpiDmDmarSubnames[] =
141{
142    "Hardware Unit Definition",
143    "Reserved Memory Region",
144    "Unknown SubTable Type"         /* Reserved */
145};
146
147static const char           *AcpiDmMadtSubnames[] =
148{
149    "Processor Local APIC",         /* ACPI_MADT_TYPE_LOCAL_APIC */
150    "I/O APIC",                     /* ACPI_MADT_TYPE_IO_APIC */
151    "Interrupt Source Override",    /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */
152    "NMI Source",                   /* ACPI_MADT_TYPE_NMI_SOURCE */
153    "Local APIC NMI",               /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */
154    "Local APIC Address Override",  /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */
155    "I/O SAPIC",                    /* ACPI_MADT_TYPE_IO_SAPIC */
156    "Local SAPIC",                  /* ACPI_MADT_TYPE_LOCAL_SAPIC */
157    "Platform Interrupt Sources",   /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */
158    "Unknown SubTable Type"         /* Reserved */
159};
160
161static const char           *AcpiDmSratSubnames[] =
162{
163    "Processor Local APIC/SAPIC Affinity",
164    "Memory Affinity",
165    "Unknown SubTable Type"         /* Reserved */
166};
167
168
169/*******************************************************************************
170 *
171 * ACPI Table Data, indexed by signature.
172 *
173 * Simple tables have only a TableInfo structure, complex tables have a handler.
174 * This table must be NULL terminated. RSDP and FACS are special-cased
175 * elsewhere.
176 *
177 ******************************************************************************/
178
179static ACPI_DMTABLE_DATA    AcpiDmTableData[] =
180{
181    {ACPI_SIG_ASF,  NULL,                   AcpiDmDumpAsf,  "Alert Standard Format table"},
182    {ACPI_SIG_BOOT, AcpiDmTableInfoBoot,    NULL,           "Simple Boot Flag Table"},
183    {ACPI_SIG_CPEP, NULL,                   AcpiDmDumpCpep, "Corrected Platform Error Polling table"},
184    {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp,    NULL,           "Debug Port table"},
185    {ACPI_SIG_DMAR, NULL,                   AcpiDmDumpDmar, "DMA Remapping table"},
186    {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt,    NULL,           "Embedded Controller Boot Resources Table"},
187    {ACPI_SIG_FADT, NULL,                   AcpiDmDumpFadt, "Fixed ACPI Description Table"},
188    {ACPI_SIG_HPET, AcpiDmTableInfoHpet,    NULL,           "High Precision Event Timer table"},
189    {ACPI_SIG_MADT, NULL,                   AcpiDmDumpMadt, "Multiple APIC Description Table"},
190    {ACPI_SIG_MCFG, NULL,                   AcpiDmDumpMcfg, "Memory Mapped Configuration table"},
191    {ACPI_SIG_RSDT, NULL,                   AcpiDmDumpRsdt, "Root System Description Table"},
192    {ACPI_SIG_SBST, AcpiDmTableInfoSbst,    NULL,           "Smart Battery Specification Table"},
193    {ACPI_SIG_SLIT, NULL,                   AcpiDmDumpSlit, "System Locality Information Table"},
194    {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr,    NULL,           "Serial Port Console Redirection table"},
195    {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi,    NULL,           "Server Platform Management Interface table"},
196    {ACPI_SIG_SRAT, NULL,                   AcpiDmDumpSrat, "System Resource Affinity Table"},
197    {ACPI_SIG_TCPA, AcpiDmTableInfoTcpa,    NULL,           "Trusted Computing Platform Alliance table"},
198    {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt,    NULL,           "Watchdog Resource Table"},
199    {ACPI_SIG_XSDT, NULL,                   AcpiDmDumpXsdt, "Extended System Description Table"},
200    {NULL,          NULL,                   NULL,           NULL}
201};
202
203
204/*******************************************************************************
205 *
206 * FUNCTION:    AcpiTbGenerateChecksum
207 *
208 * PARAMETERS:  Table               - Pointer to a valid ACPI table (with a
209 *                                    standard ACPI header)
210 *
211 * RETURN:      8 bit checksum of buffer
212 *
213 * DESCRIPTION: Computes an 8 bit checksum of the table.
214 *
215 ******************************************************************************/
216
217UINT8
218AcpiTbGenerateChecksum (
219    ACPI_TABLE_HEADER       *Table)
220{
221    UINT8                   Checksum;
222
223
224    /* Sum the entire table as-is */
225
226    Checksum = AcpiTbChecksum ((UINT8 *) Table, Table->Length);
227
228    /* Subtract off the existing checksum value in the table */
229
230    Checksum = (UINT8) (Checksum - Table->Checksum);
231
232    /* Compute the final checksum */
233
234    Checksum = (UINT8) (0 - Checksum);
235    return (Checksum);
236}
237
238
239/*******************************************************************************
240 *
241 * FUNCTION:    AcpiDmGetTableData
242 *
243 * PARAMETERS:  Signature           - ACPI signature (4 chars) to match
244 *
245 * RETURN:      Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found.
246 *
247 * DESCRIPTION: Find a match in the global table of supported ACPI tables
248 *
249 ******************************************************************************/
250
251static ACPI_DMTABLE_DATA *
252AcpiDmGetTableData (
253    char                    *Signature)
254{
255    ACPI_DMTABLE_DATA       *TableData;
256
257
258    for (TableData = AcpiDmTableData; TableData->Signature; TableData++)
259    {
260        if (ACPI_COMPARE_NAME (Signature, TableData->Signature))
261        {
262            return (TableData);
263        }
264    }
265
266    return (NULL);
267}
268
269
270/*******************************************************************************
271 *
272 * FUNCTION:    AcpiDmDumpDataTable
273 *
274 * PARAMETERS:  Table               - An ACPI table
275 *
276 * RETURN:      None.
277 *
278 * DESCRIPTION: Format the contents of an ACPI data table (any table other
279 *              than an SSDT or DSDT that does not contain executable AML code)
280 *
281 ******************************************************************************/
282
283void
284AcpiDmDumpDataTable (
285    ACPI_TABLE_HEADER       *Table)
286{
287    ACPI_DMTABLE_DATA       *TableData;
288    UINT32                  Length;
289
290
291    /* Ignore tables that contain AML */
292
293    if (AcpiUtIsAmlTable (Table))
294    {
295        return;
296    }
297
298    /*
299     * Handle tables that don't use the common ACPI table header structure.
300     * Currently, these are the FACS and RSDP.
301     */
302    if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS))
303    {
304        Length = Table->Length;
305        AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs);
306    }
307    else if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_RSDP))
308    {
309        Length = AcpiDmDumpRsdp (Table);
310    }
311    else
312    {
313        /*
314         * All other tables must use the common ACPI table header, dump it now
315         */
316        Length = Table->Length;
317        AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader);
318        AcpiOsPrintf ("\n");
319
320        /* Match signature and dispatch appropriately */
321
322        TableData = AcpiDmGetTableData (Table->Signature);
323        if (!TableData)
324        {
325            if (!ACPI_STRNCMP (Table->Signature, "OEM", 3))
326            {
327                AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n",
328                    Table->Signature);
329            }
330            else
331            {
332                AcpiOsPrintf ("\n**** Unknown ACPI table type [%4.4s]\n\n",
333                    Table->Signature);
334            }
335        }
336        else if (TableData->TableHandler)
337        {
338            /* Complex table, has a handler */
339
340            TableData->TableHandler (Table);
341        }
342        else if (TableData->TableInfo)
343        {
344            /* Simple table, just walk the info table */
345
346            AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo);
347        }
348    }
349
350    /* Always dump the raw table data */
351
352    AcpiOsPrintf ("\nRaw Table Data\n\n");
353    AcpiUtDumpBuffer2 (ACPI_CAST_PTR (UINT8, Table), Length, DB_BYTE_DISPLAY);
354}
355
356
357/*******************************************************************************
358 *
359 * FUNCTION:    AcpiDmLineHeader
360 *
361 * PARAMETERS:  Offset              - Current byte offset, from table start
362 *              ByteLength          - Length of the field in bytes, 0 for flags
363 *              Name                - Name of this field
364 *              Value               - Optional value, displayed on left of ':'
365 *
366 * RETURN:      None
367 *
368 * DESCRIPTION: Utility routines for formatting output lines. Displays the
369 *              current table offset in hex and decimal, the field length,
370 *              and the field name.
371 *
372 ******************************************************************************/
373
374void
375AcpiDmLineHeader (
376    UINT32                  Offset,
377    UINT32                  ByteLength,
378    char                    *Name)
379{
380
381    if (ByteLength)
382    {
383        AcpiOsPrintf ("[%3.3Xh %3.3d% 3d] %28s : ",
384            Offset, Offset, ByteLength, Name);
385    }
386    else
387    {
388        AcpiOsPrintf ("%42s : ",
389            Name);
390    }
391}
392
393void
394AcpiDmLineHeader2 (
395    UINT32                  Offset,
396    UINT32                  ByteLength,
397    char                    *Name,
398    UINT32                  Value)
399{
400
401    if (ByteLength)
402    {
403        AcpiOsPrintf ("[%3.3Xh %3.3d% 3d] %24s % 3d : ",
404            Offset, Offset, ByteLength, Name, Value);
405    }
406    else
407    {
408        AcpiOsPrintf ("[%3.3Xh %3.3d   ] %24s % 3d : ",
409            Offset, Offset, Name, Value);
410    }
411}
412
413
414/*******************************************************************************
415 *
416 * FUNCTION:    AcpiDmDumpTable
417 *
418 * PARAMETERS:  TableLength         - Length of the entire ACPI table
419 *              TableOffset         - Starting offset within the table for this
420 *                                    sub-descriptor (0 if main table)
421 *              Table               - The ACPI table
422 *              SubtableLength      - Lenghth of this sub-descriptor
423 *              Info                - Info table for this ACPI table
424 *
425 * RETURN:      None
426 *
427 * DESCRIPTION: Display ACPI table contents by walking the Info table.
428 *
429 ******************************************************************************/
430
431void
432AcpiDmDumpTable (
433    UINT32                  TableLength,
434    UINT32                  TableOffset,
435    void                    *Table,
436    UINT32                  SubtableLength,
437    ACPI_DMTABLE_INFO       *Info)
438{
439    UINT8                   *Target;
440    UINT32                  CurrentOffset;
441    UINT32                  ByteLength;
442    UINT8                   Temp8;
443    UINT16                  Temp16;
444    ACPI_DMTABLE_DATA       *TableData;
445
446
447    if (!Info)
448    {
449        AcpiOsPrintf ("Display not implemented\n");
450        return;
451    }
452
453    /* Walk entire Info table; Null name terminates */
454
455    for (; Info->Name; Info++)
456    {
457        /*
458         * Target points to the field within the ACPI Table. CurrentOffset is
459         * the offset of the field from the start of the main table.
460         */
461        Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset);
462        CurrentOffset = TableOffset + Info->Offset;
463
464        /* Check for beyond EOT or beyond subtable end */
465
466        if ((CurrentOffset >= TableLength) ||
467            (SubtableLength && (Info->Offset >= SubtableLength)))
468        {
469            return;
470        }
471
472        /* Generate the byte length for this field */
473
474        switch (Info->Opcode)
475        {
476        case ACPI_DMT_UINT8:
477        case ACPI_DMT_CHKSUM:
478        case ACPI_DMT_SPACEID:
479        case ACPI_DMT_MADT:
480        case ACPI_DMT_SRAT:
481            ByteLength = 1;
482            break;
483        case ACPI_DMT_UINT16:
484        case ACPI_DMT_DMAR:
485            ByteLength = 2;
486            break;
487        case ACPI_DMT_UINT24:
488            ByteLength = 3;
489            break;
490        case ACPI_DMT_UINT32:
491        case ACPI_DMT_NAME4:
492        case ACPI_DMT_SIG:
493            ByteLength = 4;
494            break;
495        case ACPI_DMT_NAME6:
496            ByteLength = 6;
497            break;
498        case ACPI_DMT_UINT56:
499            ByteLength = 7;
500            break;
501        case ACPI_DMT_UINT64:
502        case ACPI_DMT_NAME8:
503            ByteLength = 8;
504            break;
505        case ACPI_DMT_STRING:
506            ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1;
507            break;
508        case ACPI_DMT_GAS:
509            AcpiOsPrintf ("\n");
510            ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
511            break;
512        default:
513            ByteLength = 0;
514            break;
515        }
516
517        /* Start a new line and decode the opcode */
518
519        AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name);
520
521        switch (Info->Opcode)
522        {
523        /* Single-bit Flag fields. Note: Opcode is the bit position */
524
525        case ACPI_DMT_FLAG0:
526        case ACPI_DMT_FLAG1:
527        case ACPI_DMT_FLAG2:
528        case ACPI_DMT_FLAG3:
529        case ACPI_DMT_FLAG4:
530        case ACPI_DMT_FLAG5:
531        case ACPI_DMT_FLAG6:
532        case ACPI_DMT_FLAG7:
533
534            AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01);
535            break;
536
537        /* 2-bit Flag fields */
538
539        case ACPI_DMT_FLAGS0:
540
541            AcpiOsPrintf ("%1.1X\n", *Target & 0x03);
542            break;
543
544        case ACPI_DMT_FLAGS2:
545
546            AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03);
547            break;
548
549        /* Standard Data Types */
550
551        case ACPI_DMT_UINT8:
552
553            AcpiOsPrintf ("%2.2X\n", *Target);
554            break;
555
556        case ACPI_DMT_UINT16:
557
558            AcpiOsPrintf ("%4.4X\n", ACPI_GET16 (Target));
559            break;
560
561        case ACPI_DMT_UINT24:
562
563            AcpiOsPrintf ("%2.2X%2.2X%2.2X\n",
564                *Target, *(Target + 1), *(Target + 2));
565            break;
566
567        case ACPI_DMT_UINT32:
568
569            AcpiOsPrintf ("%8.8X\n", ACPI_GET32 (Target));
570            break;
571
572        case ACPI_DMT_UINT56:
573
574            AcpiOsPrintf ("%6.6X%8.8X\n",
575                ACPI_HIDWORD (ACPI_GET64 (Target)) & 0x00FFFFFF,
576                ACPI_LODWORD (ACPI_GET64 (Target)));
577            break;
578
579        case ACPI_DMT_UINT64:
580
581            AcpiOsPrintf ("%8.8X%8.8X\n",
582                ACPI_FORMAT_UINT64 (ACPI_GET64 (Target)));
583            break;
584
585        case ACPI_DMT_STRING:
586
587            AcpiOsPrintf ("%s\n", ACPI_CAST_PTR (char, Target));
588            break;
589
590        /* Fixed length ASCII name fields */
591
592        case ACPI_DMT_SIG:
593
594            AcpiDmCheckAscii (Target, 4);
595            AcpiOsPrintf ("\"%4.4s\"    ", Target);
596            TableData = AcpiDmGetTableData (ACPI_CAST_PTR (char, Target));
597            if (TableData)
598            {
599                AcpiOsPrintf ("/* %s */", TableData->Name);
600            }
601            AcpiOsPrintf ("\n");
602            break;
603
604        case ACPI_DMT_NAME4:
605
606            AcpiDmCheckAscii (Target, 4);
607            AcpiOsPrintf ("\"%4.4s\"\n", Target);
608            break;
609
610        case ACPI_DMT_NAME6:
611
612            AcpiDmCheckAscii (Target, 6);
613            AcpiOsPrintf ("\"%6.6s\"\n", Target);
614            break;
615
616        case ACPI_DMT_NAME8:
617
618            AcpiDmCheckAscii (Target, 8);
619            AcpiOsPrintf ("\"%8.8s\"\n", Target);
620            break;
621
622        /* Special Data Types */
623
624        case ACPI_DMT_CHKSUM:
625
626            /* Checksum, display and validate */
627
628            AcpiOsPrintf ("%2.2X", *Target);
629            Temp8 = AcpiTbGenerateChecksum (Table);
630            if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
631            {
632                AcpiOsPrintf (
633                    "     /* Incorrect checksum, should be %2.2X */", Temp8);
634            }
635            AcpiOsPrintf ("\n");
636            break;
637
638        case ACPI_DMT_SPACEID:
639
640            /* Address Space ID */
641
642            AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiUtGetRegionName (*Target));
643            break;
644
645        case ACPI_DMT_GAS:
646
647            /* Generic Address Structure */
648
649            AcpiOsPrintf ("<Generic Address Structure>\n");
650            AcpiDmDumpTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
651                CurrentOffset, Target, 0, AcpiDmTableInfoGas);
652            break;
653
654        case ACPI_DMT_DMAR:
655
656            /* DMAR subtable types */
657
658            Temp16 = *Target;
659            if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
660            {
661                Temp16 = ACPI_DMAR_TYPE_RESERVED;
662            }
663
664            AcpiOsPrintf ("%4.4X <%s>\n", *Target, AcpiDmDmarSubnames[Temp16]);
665            break;
666
667        case ACPI_DMT_MADT:
668
669            /* MADT subtable types */
670
671            Temp8 = *Target;
672            if (Temp8 > ACPI_MADT_TYPE_RESERVED)
673            {
674                Temp8 = ACPI_MADT_TYPE_RESERVED;
675            }
676
677            AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmMadtSubnames[Temp8]);
678            break;
679
680        case ACPI_DMT_SRAT:
681
682            /* SRAT subtable types */
683
684            Temp8 = *Target;
685            if (Temp8 > ACPI_SRAT_TYPE_RESERVED)
686            {
687                Temp8 = ACPI_SRAT_TYPE_RESERVED;
688            }
689
690            AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmSratSubnames[Temp8]);
691            break;
692
693        case ACPI_DMT_EXIT:
694            return;
695
696        default:
697            ACPI_ERROR ((AE_INFO,
698                "**** Invalid table opcode [%X] ****\n", Info->Opcode));
699            return;
700        }
701    }
702}
703
704
705/*******************************************************************************
706 *
707 * FUNCTION:    AcpiDmCheckAscii
708 *
709 * PARAMETERS:  Name                - Ascii string
710 *              Count               - Number of characters to check
711 *
712 * RETURN:      None
713 *
714 * DESCRIPTION: Ensure that the requested number of characters are printable
715 *              Ascii characters. Sets non-printable and null chars to <space>.
716 *
717 ******************************************************************************/
718
719static void
720AcpiDmCheckAscii (
721    UINT8                   *Name,
722    UINT32                  Count)
723{
724    UINT32                  i;
725
726
727    for (i = 0; i < Count; i++)
728    {
729        if (!Name[i] || !isprint (Name[i]))
730        {
731            Name[i] = ' ';
732        }
733    }
734}
735