xref: /freebsd/sys/contrib/dev/acpica/compiler/aslprune.c (revision f8146b882bc156c1d8ddf14bbea67253ebc064bb)
11c0e1b6dSJung-uk Kim /******************************************************************************
21c0e1b6dSJung-uk Kim  *
31c0e1b6dSJung-uk Kim  * Module Name: aslprune - Parse tree prune utility
41c0e1b6dSJung-uk Kim  *
51c0e1b6dSJung-uk Kim  *****************************************************************************/
61c0e1b6dSJung-uk Kim 
71c0e1b6dSJung-uk Kim /*
8*f8146b88SJung-uk Kim  * Copyright (C) 2000 - 2016, Intel Corp.
91c0e1b6dSJung-uk Kim  * All rights reserved.
101c0e1b6dSJung-uk Kim  *
111c0e1b6dSJung-uk Kim  * Redistribution and use in source and binary forms, with or without
121c0e1b6dSJung-uk Kim  * modification, are permitted provided that the following conditions
131c0e1b6dSJung-uk Kim  * are met:
141c0e1b6dSJung-uk Kim  * 1. Redistributions of source code must retain the above copyright
151c0e1b6dSJung-uk Kim  *    notice, this list of conditions, and the following disclaimer,
161c0e1b6dSJung-uk Kim  *    without modification.
171c0e1b6dSJung-uk Kim  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
181c0e1b6dSJung-uk Kim  *    substantially similar to the "NO WARRANTY" disclaimer below
191c0e1b6dSJung-uk Kim  *    ("Disclaimer") and any redistribution must be conditioned upon
201c0e1b6dSJung-uk Kim  *    including a substantially similar Disclaimer requirement for further
211c0e1b6dSJung-uk Kim  *    binary redistribution.
221c0e1b6dSJung-uk Kim  * 3. Neither the names of the above-listed copyright holders nor the names
231c0e1b6dSJung-uk Kim  *    of any contributors may be used to endorse or promote products derived
241c0e1b6dSJung-uk Kim  *    from this software without specific prior written permission.
251c0e1b6dSJung-uk Kim  *
261c0e1b6dSJung-uk Kim  * Alternatively, this software may be distributed under the terms of the
271c0e1b6dSJung-uk Kim  * GNU General Public License ("GPL") version 2 as published by the Free
281c0e1b6dSJung-uk Kim  * Software Foundation.
291c0e1b6dSJung-uk Kim  *
301c0e1b6dSJung-uk Kim  * NO WARRANTY
311c0e1b6dSJung-uk Kim  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
321c0e1b6dSJung-uk Kim  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
331c0e1b6dSJung-uk Kim  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
341c0e1b6dSJung-uk Kim  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
351c0e1b6dSJung-uk Kim  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
361c0e1b6dSJung-uk Kim  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
371c0e1b6dSJung-uk Kim  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
381c0e1b6dSJung-uk Kim  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
391c0e1b6dSJung-uk Kim  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
401c0e1b6dSJung-uk Kim  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
411c0e1b6dSJung-uk Kim  * POSSIBILITY OF SUCH DAMAGES.
421c0e1b6dSJung-uk Kim  */
431c0e1b6dSJung-uk Kim 
441c0e1b6dSJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h>
451c0e1b6dSJung-uk Kim #include "aslcompiler.y.h"
461c0e1b6dSJung-uk Kim #include <contrib/dev/acpica/include/acapps.h>
471c0e1b6dSJung-uk Kim 
481c0e1b6dSJung-uk Kim #define _COMPONENT          ACPI_COMPILER
491c0e1b6dSJung-uk Kim         ACPI_MODULE_NAME    ("aslprune")
501c0e1b6dSJung-uk Kim 
511c0e1b6dSJung-uk Kim 
521c0e1b6dSJung-uk Kim /* Local prototypes */
531c0e1b6dSJung-uk Kim 
541c0e1b6dSJung-uk Kim static ACPI_STATUS
551c0e1b6dSJung-uk Kim PrTreePruneWalk (
561c0e1b6dSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
571c0e1b6dSJung-uk Kim     UINT32                  Level,
581c0e1b6dSJung-uk Kim     void                    *Context);
591c0e1b6dSJung-uk Kim 
601c0e1b6dSJung-uk Kim static void
611c0e1b6dSJung-uk Kim PrPrintObjectAtLevel (
621c0e1b6dSJung-uk Kim     UINT32                  Level,
631c0e1b6dSJung-uk Kim     const char              *ObjectName);
641c0e1b6dSJung-uk Kim 
651c0e1b6dSJung-uk Kim 
66*f8146b88SJung-uk Kim /* Structure used for the pruning parse tree walk */
67*f8146b88SJung-uk Kim 
681c0e1b6dSJung-uk Kim typedef struct acpi_prune_info
691c0e1b6dSJung-uk Kim {
701c0e1b6dSJung-uk Kim     UINT32                  PruneLevel;
711c0e1b6dSJung-uk Kim     UINT16                  ParseOpcode;
721c0e1b6dSJung-uk Kim     UINT16                  Count;
731c0e1b6dSJung-uk Kim 
741c0e1b6dSJung-uk Kim } ACPI_PRUNE_INFO;
751c0e1b6dSJung-uk Kim 
761c0e1b6dSJung-uk Kim 
771c0e1b6dSJung-uk Kim /*******************************************************************************
781c0e1b6dSJung-uk Kim  *
791c0e1b6dSJung-uk Kim  * FUNCTION:    AslPruneParseTree
801c0e1b6dSJung-uk Kim  *
811c0e1b6dSJung-uk Kim  * PARAMETERS:  PruneDepth              - Number of levels to prune
821c0e1b6dSJung-uk Kim  *              Type                    - Prune type (Device, Method, etc.)
831c0e1b6dSJung-uk Kim  *
841c0e1b6dSJung-uk Kim  * RETURN:      None
851c0e1b6dSJung-uk Kim  *
861c0e1b6dSJung-uk Kim  * DESCRIPTION: Prune off one or more levels of the ASL parse tree
871c0e1b6dSJung-uk Kim  *
881c0e1b6dSJung-uk Kim  ******************************************************************************/
891c0e1b6dSJung-uk Kim 
901c0e1b6dSJung-uk Kim void
911c0e1b6dSJung-uk Kim AslPruneParseTree (
921c0e1b6dSJung-uk Kim     UINT32                  PruneDepth,
931c0e1b6dSJung-uk Kim     UINT32                  Type)
941c0e1b6dSJung-uk Kim {
951c0e1b6dSJung-uk Kim     ACPI_PRUNE_INFO         PruneObj;
961c0e1b6dSJung-uk Kim 
971c0e1b6dSJung-uk Kim 
981c0e1b6dSJung-uk Kim     PruneObj.PruneLevel = PruneDepth;
991c0e1b6dSJung-uk Kim     PruneObj.Count = 0;
1001c0e1b6dSJung-uk Kim 
1011c0e1b6dSJung-uk Kim     switch (Type)
1021c0e1b6dSJung-uk Kim     {
1031c0e1b6dSJung-uk Kim     case 0:
1041c0e1b6dSJung-uk Kim         PruneObj.ParseOpcode = (UINT16) PARSEOP_DEVICE;
1051c0e1b6dSJung-uk Kim         break;
1061c0e1b6dSJung-uk Kim 
1071c0e1b6dSJung-uk Kim     case 1:
1081c0e1b6dSJung-uk Kim         PruneObj.ParseOpcode = (UINT16) PARSEOP_METHOD;
1091c0e1b6dSJung-uk Kim         break;
1101c0e1b6dSJung-uk Kim 
1111c0e1b6dSJung-uk Kim     case 2:
1121c0e1b6dSJung-uk Kim         PruneObj.ParseOpcode = (UINT16) PARSEOP_IF;
1131c0e1b6dSJung-uk Kim         break;
1141c0e1b6dSJung-uk Kim 
1151c0e1b6dSJung-uk Kim     default:
1161c0e1b6dSJung-uk Kim         AcpiOsPrintf ("Unsupported type: %u\n", Type);
1171c0e1b6dSJung-uk Kim         return;
1181c0e1b6dSJung-uk Kim     }
1191c0e1b6dSJung-uk Kim 
1201c0e1b6dSJung-uk Kim     AcpiOsPrintf ("Pruning parse tree, from depth %u\n",
1211c0e1b6dSJung-uk Kim         PruneDepth);
1221c0e1b6dSJung-uk Kim 
1231c0e1b6dSJung-uk Kim     AcpiOsPrintf ("\nRemoving Objects:\n");
1241c0e1b6dSJung-uk Kim 
125*f8146b88SJung-uk Kim     TrWalkParseTree (Gbl_ParseTreeRoot, ASL_WALK_VISIT_DOWNWARD,
1261c0e1b6dSJung-uk Kim         PrTreePruneWalk, NULL, ACPI_CAST_PTR (void, &PruneObj));
1271c0e1b6dSJung-uk Kim 
1281c0e1b6dSJung-uk Kim     AcpiOsPrintf ("\n%u Total Objects Removed\n", PruneObj.Count);
1291c0e1b6dSJung-uk Kim }
1301c0e1b6dSJung-uk Kim 
1311c0e1b6dSJung-uk Kim 
1321c0e1b6dSJung-uk Kim /*******************************************************************************
1331c0e1b6dSJung-uk Kim  *
1341c0e1b6dSJung-uk Kim  * FUNCTION:    PrPrintObjectAtLevel
1351c0e1b6dSJung-uk Kim  *
1361c0e1b6dSJung-uk Kim  * PARAMETERS:  Level                   - Current nesting level
1371c0e1b6dSJung-uk Kim  *              ObjectName              - ACPI name for the object
1381c0e1b6dSJung-uk Kim  *
1391c0e1b6dSJung-uk Kim  * RETURN:      None
1401c0e1b6dSJung-uk Kim  *
1411c0e1b6dSJung-uk Kim  * DESCRIPTION: Print object name with indent
1421c0e1b6dSJung-uk Kim  *
1431c0e1b6dSJung-uk Kim  ******************************************************************************/
1441c0e1b6dSJung-uk Kim 
1451c0e1b6dSJung-uk Kim static void
1461c0e1b6dSJung-uk Kim PrPrintObjectAtLevel (
1471c0e1b6dSJung-uk Kim     UINT32                  Level,
1481c0e1b6dSJung-uk Kim     const char              *ObjectName)
1491c0e1b6dSJung-uk Kim {
1501c0e1b6dSJung-uk Kim     UINT32                  i;
1511c0e1b6dSJung-uk Kim 
1521c0e1b6dSJung-uk Kim 
1531c0e1b6dSJung-uk Kim     for (i = 0; i < Level; i++)
1541c0e1b6dSJung-uk Kim     {
1551c0e1b6dSJung-uk Kim         AcpiOsPrintf ("  ");
1561c0e1b6dSJung-uk Kim     }
1571c0e1b6dSJung-uk Kim 
1581c0e1b6dSJung-uk Kim     AcpiOsPrintf ("[%s] at Level [%u]\n", ObjectName, Level);
1591c0e1b6dSJung-uk Kim }
1601c0e1b6dSJung-uk Kim 
1611c0e1b6dSJung-uk Kim 
1621c0e1b6dSJung-uk Kim /*******************************************************************************
1631c0e1b6dSJung-uk Kim  *
1641c0e1b6dSJung-uk Kim  * FUNCTION:    PrTreePruneWalk
1651c0e1b6dSJung-uk Kim  *
1661c0e1b6dSJung-uk Kim  * PARAMETERS:  Parse tree walk callback
1671c0e1b6dSJung-uk Kim  *
1681c0e1b6dSJung-uk Kim  * RETURN:      Status
1691c0e1b6dSJung-uk Kim  *
1701c0e1b6dSJung-uk Kim  * DESCRIPTION: Prune off one or more levels of the ASL parse tree
1711c0e1b6dSJung-uk Kim  *
1721c0e1b6dSJung-uk Kim  * Current objects that can be pruned are: Devices, Methods, and If/Else
1731c0e1b6dSJung-uk Kim  * blocks.
1741c0e1b6dSJung-uk Kim  *
1751c0e1b6dSJung-uk Kim  ******************************************************************************/
1761c0e1b6dSJung-uk Kim 
1771c0e1b6dSJung-uk Kim static ACPI_STATUS
1781c0e1b6dSJung-uk Kim PrTreePruneWalk (
1791c0e1b6dSJung-uk Kim     ACPI_PARSE_OBJECT       *Op,
1801c0e1b6dSJung-uk Kim     UINT32                  Level,
1811c0e1b6dSJung-uk Kim     void                    *Context)
1821c0e1b6dSJung-uk Kim {
1831c0e1b6dSJung-uk Kim     ACPI_PRUNE_INFO         *PruneObj = (ACPI_PRUNE_INFO *) Context;
1841c0e1b6dSJung-uk Kim 
1851c0e1b6dSJung-uk Kim 
1861c0e1b6dSJung-uk Kim     /* We only care about objects below the Prune Level threshold */
1871c0e1b6dSJung-uk Kim 
1881c0e1b6dSJung-uk Kim     if (Level <= PruneObj->PruneLevel)
1891c0e1b6dSJung-uk Kim     {
1901c0e1b6dSJung-uk Kim         return (AE_OK);
1911c0e1b6dSJung-uk Kim     }
1921c0e1b6dSJung-uk Kim 
1931c0e1b6dSJung-uk Kim     if ((Op->Asl.ParseOpcode != PruneObj->ParseOpcode) &&
1941c0e1b6dSJung-uk Kim        !(Op->Asl.ParseOpcode == PARSEOP_ELSE &&
1951c0e1b6dSJung-uk Kim              PruneObj->ParseOpcode == PARSEOP_IF))
1961c0e1b6dSJung-uk Kim     {
1971c0e1b6dSJung-uk Kim         return (AE_OK);
1981c0e1b6dSJung-uk Kim     }
1991c0e1b6dSJung-uk Kim 
2001c0e1b6dSJung-uk Kim     switch (Op->Asl.ParseOpcode)
2011c0e1b6dSJung-uk Kim     {
2021c0e1b6dSJung-uk Kim     case PARSEOP_METHOD:
2031c0e1b6dSJung-uk Kim 
2041c0e1b6dSJung-uk Kim         AcpiOsPrintf ("Method");
2051c0e1b6dSJung-uk Kim         PrPrintObjectAtLevel (Level, Op->Asl.Child->Asl.Value.Name);
2061c0e1b6dSJung-uk Kim         Op->Asl.Child->Asl.Next->Asl.Next->Asl.Next->Asl.Next->Asl.Next->Asl.Next = NULL;
2071c0e1b6dSJung-uk Kim         PruneObj->Count++;
2081c0e1b6dSJung-uk Kim         break;
2091c0e1b6dSJung-uk Kim 
2101c0e1b6dSJung-uk Kim     case PARSEOP_DEVICE:
2111c0e1b6dSJung-uk Kim 
2121c0e1b6dSJung-uk Kim         AcpiOsPrintf ("Device");
2131c0e1b6dSJung-uk Kim         PrPrintObjectAtLevel (Level, Op->Asl.Child->Asl.Value.Name);
2141c0e1b6dSJung-uk Kim         Op->Asl.Child->Asl.Next = NULL;
2151c0e1b6dSJung-uk Kim         PruneObj->Count++;
2161c0e1b6dSJung-uk Kim         break;
2171c0e1b6dSJung-uk Kim 
2181c0e1b6dSJung-uk Kim     case PARSEOP_IF:
2191c0e1b6dSJung-uk Kim     case PARSEOP_ELSE:
2201c0e1b6dSJung-uk Kim 
2211c0e1b6dSJung-uk Kim         if (Op->Asl.ParseOpcode == PARSEOP_ELSE)
2221c0e1b6dSJung-uk Kim         {
2231c0e1b6dSJung-uk Kim             PrPrintObjectAtLevel(Level, "Else");
2241c0e1b6dSJung-uk Kim             Op->Asl.Child = NULL;
2251c0e1b6dSJung-uk Kim         }
2261c0e1b6dSJung-uk Kim         else
2271c0e1b6dSJung-uk Kim         {
2281c0e1b6dSJung-uk Kim             PrPrintObjectAtLevel(Level, "If");
2291c0e1b6dSJung-uk Kim             Op->Asl.Child->Asl.Next = NULL;
2301c0e1b6dSJung-uk Kim         }
2311c0e1b6dSJung-uk Kim 
2321c0e1b6dSJung-uk Kim         PruneObj->Count++;
2331c0e1b6dSJung-uk Kim         break;
2341c0e1b6dSJung-uk Kim 
2351c0e1b6dSJung-uk Kim     default:
2361c0e1b6dSJung-uk Kim 
2371c0e1b6dSJung-uk Kim         break;
2381c0e1b6dSJung-uk Kim     }
2391c0e1b6dSJung-uk Kim 
2401c0e1b6dSJung-uk Kim     return (AE_OK);
2411c0e1b6dSJung-uk Kim }
242