[BACK]Return to dmtables.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / external / bsd / acpica / dist / common

Annotation of src/sys/external/bsd/acpica/dist/common/dmtables.c, Revision 1.1.1.1.2.2

1.1.1.1.2.2! skrll       1: /******************************************************************************
        !             2:  *
        !             3:  * Module Name: dmtables - disassembler ACPI table support
        !             4:  *
        !             5:  *****************************************************************************/
        !             6:
        !             7: /*
        !             8:  * Copyright (C) 2000 - 2016, Intel Corp.
        !             9:  * All rights reserved.
        !            10:  *
        !            11:  * Redistribution and use in source and binary forms, with or without
        !            12:  * modification, are permitted provided that the following conditions
        !            13:  * are met:
        !            14:  * 1. Redistributions of source code must retain the above copyright
        !            15:  *    notice, this list of conditions, and the following disclaimer,
        !            16:  *    without modification.
        !            17:  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
        !            18:  *    substantially similar to the "NO WARRANTY" disclaimer below
        !            19:  *    ("Disclaimer") and any redistribution must be conditioned upon
        !            20:  *    including a substantially similar Disclaimer requirement for further
        !            21:  *    binary redistribution.
        !            22:  * 3. Neither the names of the above-listed copyright holders nor the names
        !            23:  *    of any contributors may be used to endorse or promote products derived
        !            24:  *    from this software without specific prior written permission.
        !            25:  *
        !            26:  * Alternatively, this software may be distributed under the terms of the
        !            27:  * GNU General Public License ("GPL") version 2 as published by the Free
        !            28:  * Software Foundation.
        !            29:  *
        !            30:  * NO WARRANTY
        !            31:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
        !            32:  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
        !            33:  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
        !            34:  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
        !            35:  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
        !            36:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
        !            37:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
        !            38:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
        !            39:  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
        !            40:  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
        !            41:  * POSSIBILITY OF SUCH DAMAGES.
        !            42:  */
        !            43:
        !            44: #include "aslcompiler.h"
        !            45: #include "acapps.h"
        !            46: #include "acdispat.h"
        !            47: #include "acnamesp.h"
        !            48: #include "actables.h"
        !            49: #include "acparser.h"
        !            50:
        !            51: #include <stdio.h>
        !            52: #include <time.h>
        !            53:
        !            54: #define _COMPONENT          ACPI_TOOLS
        !            55:         ACPI_MODULE_NAME    ("dmtables")
        !            56:
        !            57:
        !            58: /* Local prototypes */
        !            59:
        !            60: static void
        !            61: AdCreateTableHeader (
        !            62:     char                    *Filename,
        !            63:     ACPI_TABLE_HEADER       *Table);
        !            64:
        !            65: static ACPI_STATUS
        !            66: AdStoreTable (
        !            67:     ACPI_TABLE_HEADER       *Table,
        !            68:     UINT32                  *TableIndex);
        !            69:
        !            70:
        !            71: extern ACPI_TABLE_DESC      LocalTables[1];
        !            72: extern ACPI_PARSE_OBJECT    *AcpiGbl_ParseOpRoot;
        !            73:
        !            74:
        !            75: /******************************************************************************
        !            76:  *
        !            77:  * FUNCTION:    AdDisassemblerHeader
        !            78:  *
        !            79:  * PARAMETERS:  Filename            - Input file for the table
        !            80:  *              TableType           - Either AML or DataTable
        !            81:  *
        !            82:  * RETURN:      None
        !            83:  *
        !            84:  * DESCRIPTION: Create the disassembler header, including ACPICA signon with
        !            85:  *              current time and date.
        !            86:  *
        !            87:  *****************************************************************************/
        !            88:
        !            89: void
        !            90: AdDisassemblerHeader (
        !            91:     char                    *Filename,
        !            92:     UINT8                   TableType)
        !            93: {
        !            94:     time_t                  Timer;
        !            95:
        !            96:
        !            97:     time (&Timer);
        !            98:
        !            99:     /* Header and input table info */
        !           100:
        !           101:     AcpiOsPrintf ("/*\n");
        !           102:     AcpiOsPrintf (ACPI_COMMON_HEADER (AML_DISASSEMBLER_NAME, " * "));
        !           103:
        !           104:     if (TableType == ACPI_IS_AML_TABLE)
        !           105:     {
        !           106:         if (AcpiGbl_CstyleDisassembly)
        !           107:         {
        !           108:             AcpiOsPrintf (
        !           109:                 " * Disassembling to symbolic ASL+ operators\n"
        !           110:                 " *\n");
        !           111:         }
        !           112:         else
        !           113:         {
        !           114:             AcpiOsPrintf (
        !           115:                 " * Disassembling to non-symbolic legacy ASL operators\n"
        !           116:                 " *\n");
        !           117:         }
        !           118:     }
        !           119:
        !           120:     AcpiOsPrintf (" * Disassembly of %s, %s", Filename, ctime (&Timer));
        !           121:     AcpiOsPrintf (" *\n");
        !           122: }
        !           123:
        !           124:
        !           125: /******************************************************************************
        !           126:  *
        !           127:  * FUNCTION:    AdCreateTableHeader
        !           128:  *
        !           129:  * PARAMETERS:  Filename            - Input file for the table
        !           130:  *              Table               - Pointer to the raw table
        !           131:  *
        !           132:  * RETURN:      None
        !           133:  *
        !           134:  * DESCRIPTION: Create the ASL table header, including ACPICA signon with
        !           135:  *              current time and date.
        !           136:  *
        !           137:  *****************************************************************************/
        !           138:
        !           139: static void
        !           140: AdCreateTableHeader (
        !           141:     char                    *Filename,
        !           142:     ACPI_TABLE_HEADER       *Table)
        !           143: {
        !           144:     char                    *NewFilename;
        !           145:     UINT8                   Checksum;
        !           146:
        !           147:
        !           148:     /*
        !           149:      * Print file header and dump original table header
        !           150:      */
        !           151:     AdDisassemblerHeader (Filename, ACPI_IS_AML_TABLE);
        !           152:
        !           153:     AcpiOsPrintf (" * Original Table Header:\n");
        !           154:     AcpiOsPrintf (" *     Signature        \"%4.4s\"\n",    Table->Signature);
        !           155:     AcpiOsPrintf (" *     Length           0x%8.8X (%u)\n", Table->Length, Table->Length);
        !           156:
        !           157:     /* Print and validate the revision */
        !           158:
        !           159:     AcpiOsPrintf (" *     Revision         0x%2.2X",      Table->Revision);
        !           160:
        !           161:     switch (Table->Revision)
        !           162:     {
        !           163:     case 0:
        !           164:
        !           165:         AcpiOsPrintf (" **** Invalid Revision");
        !           166:         break;
        !           167:
        !           168:     case 1:
        !           169:
        !           170:         /* Revision of DSDT controls the ACPI integer width */
        !           171:
        !           172:         if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_DSDT))
        !           173:         {
        !           174:             AcpiOsPrintf (" **** 32-bit table (V1), no 64-bit math support");
        !           175:         }
        !           176:         break;
        !           177:
        !           178:     default:
        !           179:
        !           180:         break;
        !           181:     }
        !           182:     AcpiOsPrintf ("\n");
        !           183:
        !           184:     /* Print and validate the table checksum */
        !           185:
        !           186:     AcpiOsPrintf (" *     Checksum         0x%2.2X",        Table->Checksum);
        !           187:
        !           188:     Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Table->Length);
        !           189:     if (Checksum)
        !           190:     {
        !           191:         AcpiOsPrintf (" **** Incorrect checksum, should be 0x%2.2X",
        !           192:             (UINT8) (Table->Checksum - Checksum));
        !           193:     }
        !           194:
        !           195:     AcpiOsPrintf ("\n");
        !           196:     AcpiOsPrintf (" *     OEM ID           \"%.6s\"\n",     Table->OemId);
        !           197:     AcpiOsPrintf (" *     OEM Table ID     \"%.8s\"\n",     Table->OemTableId);
        !           198:     AcpiOsPrintf (" *     OEM Revision     0x%8.8X (%u)\n", Table->OemRevision, Table->OemRevision);
        !           199:     AcpiOsPrintf (" *     Compiler ID      \"%.4s\"\n",     Table->AslCompilerId);
        !           200:     AcpiOsPrintf (" *     Compiler Version 0x%8.8X (%u)\n", Table->AslCompilerRevision, Table->AslCompilerRevision);
        !           201:     AcpiOsPrintf (" */\n");
        !           202:
        !           203:     /* Create AML output filename based on input filename */
        !           204:
        !           205:     if (Filename)
        !           206:     {
        !           207:         NewFilename = FlGenerateFilename (Filename, "aml");
        !           208:     }
        !           209:     else
        !           210:     {
        !           211:         NewFilename = UtStringCacheCalloc (9);
        !           212:         if (NewFilename)
        !           213:         {
        !           214:             strncat (NewFilename, Table->Signature, 4);
        !           215:             strcat (NewFilename, ".aml");
        !           216:         }
        !           217:     }
        !           218:
        !           219:     if (!NewFilename)
        !           220:     {
        !           221:         AcpiOsPrintf (" **** Could not generate AML output filename\n");
        !           222:         return;
        !           223:     }
        !           224:
        !           225:     /* Open the ASL definition block */
        !           226:
        !           227:     AcpiOsPrintf (
        !           228:         "DefinitionBlock (\"%s\", \"%4.4s\", %hu, \"%.6s\", \"%.8s\", 0x%8.8X)\n",
        !           229:         NewFilename, Table->Signature, Table->Revision,
        !           230:         Table->OemId, Table->OemTableId, Table->OemRevision);
        !           231: }
        !           232:
        !           233:
        !           234: /******************************************************************************
        !           235:  *
        !           236:  * FUNCTION:    AdDisplayTables
        !           237:  *
        !           238:  * PARAMETERS:  Filename            - Input file for the table
        !           239:  *              Table               - Pointer to the raw table
        !           240:  *
        !           241:  * RETURN:      Status
        !           242:  *
        !           243:  * DESCRIPTION: Display (disassemble) loaded tables and dump raw tables
        !           244:  *
        !           245:  *****************************************************************************/
        !           246:
        !           247: ACPI_STATUS
        !           248: AdDisplayTables (
        !           249:     char                    *Filename,
        !           250:     ACPI_TABLE_HEADER       *Table)
        !           251: {
        !           252:
        !           253:
        !           254:     if (!AcpiGbl_ParseOpRoot)
        !           255:     {
        !           256:         return (AE_NOT_EXIST);
        !           257:     }
        !           258:
        !           259:     if (!AcpiGbl_DmOpt_Listing)
        !           260:     {
        !           261:         AdCreateTableHeader (Filename, Table);
        !           262:     }
        !           263:
        !           264:     AcpiDmDisassemble (NULL, AcpiGbl_ParseOpRoot, ACPI_UINT32_MAX);
        !           265:     MpEmitMappingInfo ();
        !           266:
        !           267:     if (AcpiGbl_DmOpt_Listing)
        !           268:     {
        !           269:         AcpiOsPrintf ("\n\nTable Header:\n");
        !           270:         AcpiUtDebugDumpBuffer ((UINT8 *) Table, sizeof (ACPI_TABLE_HEADER),
        !           271:             DB_BYTE_DISPLAY, ACPI_UINT32_MAX);
        !           272:
        !           273:         AcpiOsPrintf ("Table Body (Length 0x%X)\n", Table->Length);
        !           274:         AcpiUtDebugDumpBuffer (((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER)),
        !           275:             Table->Length, DB_BYTE_DISPLAY, ACPI_UINT32_MAX);
        !           276:     }
        !           277:
        !           278:     return (AE_OK);
        !           279: }
        !           280:
        !           281:
        !           282: /*******************************************************************************
        !           283:  *
        !           284:  * FUNCTION:    AdStoreTable
        !           285:  *
        !           286:  * PARAMETERS:  Table               - Table header
        !           287:  *              TableIndex          - Where the table index is returned
        !           288:  *
        !           289:  * RETURN:      Status and table index.
        !           290:  *
        !           291:  * DESCRIPTION: Add an ACPI table to the global table list
        !           292:  *
        !           293:  ******************************************************************************/
        !           294:
        !           295: static ACPI_STATUS
        !           296: AdStoreTable (
        !           297:     ACPI_TABLE_HEADER       *Table,
        !           298:     UINT32                  *TableIndex)
        !           299: {
        !           300:     ACPI_STATUS             Status;
        !           301:     ACPI_TABLE_DESC         *TableDesc;
        !           302:
        !           303:
        !           304:     Status = AcpiTbGetNextTableDescriptor (TableIndex, &TableDesc);
        !           305:     if (ACPI_FAILURE (Status))
        !           306:     {
        !           307:         return (Status);
        !           308:     }
        !           309:
        !           310:     /* Initialize added table */
        !           311:
        !           312:     AcpiTbInitTableDescriptor (TableDesc, ACPI_PTR_TO_PHYSADDR (Table),
        !           313:         ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL, Table);
        !           314:     Status = AcpiTbValidateTable (TableDesc);
        !           315:     return (Status);
        !           316: }
        !           317:
        !           318:
        !           319: /******************************************************************************
        !           320:  *
        !           321:  * FUNCTION:    AdGetLocalTables
        !           322:  *
        !           323:  * PARAMETERS:  None
        !           324:  *
        !           325:  * RETURN:      Status
        !           326:  *
        !           327:  * DESCRIPTION: Get the ACPI tables from either memory or a file
        !           328:  *
        !           329:  *****************************************************************************/
        !           330:
        !           331: ACPI_STATUS
        !           332: AdGetLocalTables (
        !           333:     void)
        !           334: {
        !           335:     ACPI_STATUS             Status;
        !           336:     ACPI_TABLE_HEADER       TableHeader;
        !           337:     ACPI_TABLE_HEADER       *NewTable;
        !           338:     UINT32                  TableIndex;
        !           339:
        !           340:
        !           341:     /* Get the DSDT via table override */
        !           342:
        !           343:     ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_DSDT);
        !           344:     AcpiOsTableOverride (&TableHeader, &NewTable);
        !           345:     if (!NewTable)
        !           346:     {
        !           347:         fprintf (stderr, "Could not obtain DSDT\n");
        !           348:         return (AE_NO_ACPI_TABLES);
        !           349:     }
        !           350:
        !           351:     AdWriteTable (NewTable, NewTable->Length,
        !           352:         ACPI_SIG_DSDT, NewTable->OemTableId);
        !           353:
        !           354:     /* Store DSDT in the Table Manager */
        !           355:
        !           356:     Status = AdStoreTable (NewTable, &TableIndex);
        !           357:     if (ACPI_FAILURE (Status))
        !           358:     {
        !           359:         fprintf (stderr, "Could not store DSDT\n");
        !           360:         return (AE_NO_ACPI_TABLES);
        !           361:     }
        !           362:
        !           363:     return (AE_OK);
        !           364: }
        !           365:
        !           366:
        !           367: /******************************************************************************
        !           368:  *
        !           369:  * FUNCTION:    AdParseTable
        !           370:  *
        !           371:  * PARAMETERS:  Table               - Pointer to the raw table
        !           372:  *              OwnerId             - Returned OwnerId of the table
        !           373:  *              LoadTable           - If add table to the global table list
        !           374:  *              External            - If this is an external table
        !           375:  *
        !           376:  * RETURN:      Status
        !           377:  *
        !           378:  * DESCRIPTION: Parse an ACPI AML table
        !           379:  *
        !           380:  *****************************************************************************/
        !           381:
        !           382: ACPI_STATUS
        !           383: AdParseTable (
        !           384:     ACPI_TABLE_HEADER       *Table,
        !           385:     ACPI_OWNER_ID           *OwnerId,
        !           386:     BOOLEAN                 LoadTable,
        !           387:     BOOLEAN                 External)
        !           388: {
        !           389:     ACPI_STATUS             Status = AE_OK;
        !           390:     ACPI_WALK_STATE         *WalkState;
        !           391:     UINT8                   *AmlStart;
        !           392:     UINT32                  AmlLength;
        !           393:     UINT32                  TableIndex;
        !           394:
        !           395:
        !           396:     if (!Table)
        !           397:     {
        !           398:         return (AE_NOT_EXIST);
        !           399:     }
        !           400:
        !           401:     /* Pass 1:  Parse everything except control method bodies */
        !           402:
        !           403:     fprintf (stderr, "Pass 1 parse of [%4.4s]\n", (char *) Table->Signature);
        !           404:
        !           405:     AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER);
        !           406:     AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER));
        !           407:
        !           408:     /* Create the root object */
        !           409:
        !           410:     AcpiGbl_ParseOpRoot = AcpiPsCreateScopeOp (AmlStart);
        !           411:     if (!AcpiGbl_ParseOpRoot)
        !           412:     {
        !           413:         return (AE_NO_MEMORY);
        !           414:     }
        !           415:
        !           416:     /* Create and initialize a new walk state */
        !           417:
        !           418:     WalkState = AcpiDsCreateWalkState (0, AcpiGbl_ParseOpRoot, NULL, NULL);
        !           419:     if (!WalkState)
        !           420:     {
        !           421:         return (AE_NO_MEMORY);
        !           422:     }
        !           423:
        !           424:     Status = AcpiDsInitAmlWalk (WalkState, AcpiGbl_ParseOpRoot,
        !           425:         NULL, AmlStart, AmlLength, NULL, ACPI_IMODE_LOAD_PASS1);
        !           426:     if (ACPI_FAILURE (Status))
        !           427:     {
        !           428:         return (Status);
        !           429:     }
        !           430:
        !           431:     WalkState->ParseFlags &= ~ACPI_PARSE_DELETE_TREE;
        !           432:     WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE;
        !           433:
        !           434:     Status = AcpiPsParseAml (WalkState);
        !           435:     if (ACPI_FAILURE (Status))
        !           436:     {
        !           437:         return (Status);
        !           438:     }
        !           439:
        !           440:     /* If LoadTable is FALSE, we are parsing the last loaded table */
        !           441:
        !           442:     TableIndex = AcpiGbl_RootTableList.CurrentTableCount - 1;
        !           443:
        !           444:     /* Pass 2 */
        !           445:
        !           446:     if (LoadTable)
        !           447:     {
        !           448:         Status = AdStoreTable (Table, &TableIndex);
        !           449:         if (ACPI_FAILURE (Status))
        !           450:         {
        !           451:             return (Status);
        !           452:         }
        !           453:         Status = AcpiTbAllocateOwnerId (TableIndex);
        !           454:         if (ACPI_FAILURE (Status))
        !           455:         {
        !           456:             return (Status);
        !           457:         }
        !           458:         if (OwnerId)
        !           459:         {
        !           460:             Status = AcpiTbGetOwnerId (TableIndex, OwnerId);
        !           461:             if (ACPI_FAILURE (Status))
        !           462:             {
        !           463:                 return (Status);
        !           464:             }
        !           465:         }
        !           466:     }
        !           467:
        !           468:     fprintf (stderr, "Pass 2 parse of [%4.4s]\n", (char *) Table->Signature);
        !           469:
        !           470:     Status = AcpiNsOneCompleteParse (ACPI_IMODE_LOAD_PASS2, TableIndex, NULL);
        !           471:     if (ACPI_FAILURE (Status))
        !           472:     {
        !           473:         return (Status);
        !           474:     }
        !           475:
        !           476:     /* No need to parse control methods of external table */
        !           477:
        !           478:     if (External)
        !           479:     {
        !           480:         return (AE_OK);
        !           481:     }
        !           482:
        !           483:     /*
        !           484:      * Pass 3: Parse control methods and link their parse trees
        !           485:      * into the main parse tree
        !           486:      */
        !           487:     fprintf (stderr,
        !           488:         "Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)\n");
        !           489:
        !           490:     Status = AcpiDmParseDeferredOps (AcpiGbl_ParseOpRoot);
        !           491:     fprintf (stderr, "\n");
        !           492:
        !           493:     /* Process Resource Templates */
        !           494:
        !           495:     AcpiDmFindResources (AcpiGbl_ParseOpRoot);
        !           496:
        !           497:     fprintf (stderr, "Parsing completed\n");
        !           498:     return (AE_OK);
        !           499: }

CVSweb <webmaster@jp.NetBSD.org>