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