1f556842eSJung-uk Kim /****************************************************************************** 2f556842eSJung-uk Kim * 3f556842eSJung-uk Kim * Module Name: dmextern - Support for External() ASL statements 4f556842eSJung-uk Kim * 5f556842eSJung-uk Kim *****************************************************************************/ 6f556842eSJung-uk Kim 7f556842eSJung-uk Kim /****************************************************************************** 8f556842eSJung-uk Kim * 9f556842eSJung-uk Kim * 1. Copyright Notice 10f556842eSJung-uk Kim * 119a179dd8SJung-uk Kim * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp. 12f556842eSJung-uk Kim * All rights reserved. 13f556842eSJung-uk Kim * 14f556842eSJung-uk Kim * 2. License 15f556842eSJung-uk Kim * 16f556842eSJung-uk Kim * 2.1. This is your license from Intel Corp. under its intellectual property 17f556842eSJung-uk Kim * rights. You may have additional license terms from the party that provided 18f556842eSJung-uk Kim * you this software, covering your right to use that party's intellectual 19f556842eSJung-uk Kim * property rights. 20f556842eSJung-uk Kim * 21f556842eSJung-uk Kim * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 22f556842eSJung-uk Kim * copy of the source code appearing in this file ("Covered Code") an 23f556842eSJung-uk Kim * irrevocable, perpetual, worldwide license under Intel's copyrights in the 24f556842eSJung-uk Kim * base code distributed originally by Intel ("Original Intel Code") to copy, 25f556842eSJung-uk Kim * make derivatives, distribute, use and display any portion of the Covered 26f556842eSJung-uk Kim * Code in any form, with the right to sublicense such rights; and 27f556842eSJung-uk Kim * 28f556842eSJung-uk Kim * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 29f556842eSJung-uk Kim * license (with the right to sublicense), under only those claims of Intel 30f556842eSJung-uk Kim * patents that are infringed by the Original Intel Code, to make, use, sell, 31f556842eSJung-uk Kim * offer to sell, and import the Covered Code and derivative works thereof 32f556842eSJung-uk Kim * solely to the minimum extent necessary to exercise the above copyright 33f556842eSJung-uk Kim * license, and in no event shall the patent license extend to any additions 34f556842eSJung-uk Kim * to or modifications of the Original Intel Code. No other license or right 35f556842eSJung-uk Kim * is granted directly or by implication, estoppel or otherwise; 36f556842eSJung-uk Kim * 37f556842eSJung-uk Kim * The above copyright and patent license is granted only if the following 38f556842eSJung-uk Kim * conditions are met: 39f556842eSJung-uk Kim * 40f556842eSJung-uk Kim * 3. Conditions 41f556842eSJung-uk Kim * 42f556842eSJung-uk Kim * 3.1. Redistribution of Source with Rights to Further Distribute Source. 43f556842eSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 44f556842eSJung-uk Kim * Code or modification with rights to further distribute source must include 45f556842eSJung-uk Kim * the above Copyright Notice, the above License, this list of Conditions, 46f556842eSJung-uk Kim * and the following Disclaimer and Export Compliance provision. In addition, 47f556842eSJung-uk Kim * Licensee must cause all Covered Code to which Licensee contributes to 48f556842eSJung-uk Kim * contain a file documenting the changes Licensee made to create that Covered 49f556842eSJung-uk Kim * Code and the date of any change. Licensee must include in that file the 50f556842eSJung-uk Kim * documentation of any changes made by any predecessor Licensee. Licensee 51f556842eSJung-uk Kim * must include a prominent statement that the modification is derived, 52f556842eSJung-uk Kim * directly or indirectly, from Original Intel Code. 53f556842eSJung-uk Kim * 54f556842eSJung-uk Kim * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 55f556842eSJung-uk Kim * Redistribution of source code of any substantial portion of the Covered 56f556842eSJung-uk Kim * Code or modification without rights to further distribute source must 57f556842eSJung-uk Kim * include the following Disclaimer and Export Compliance provision in the 58f556842eSJung-uk Kim * documentation and/or other materials provided with distribution. In 59f556842eSJung-uk Kim * addition, Licensee may not authorize further sublicense of source of any 60f556842eSJung-uk Kim * portion of the Covered Code, and must include terms to the effect that the 61f556842eSJung-uk Kim * license from Licensee to its licensee is limited to the intellectual 62f556842eSJung-uk Kim * property embodied in the software Licensee provides to its licensee, and 63f556842eSJung-uk Kim * not to intellectual property embodied in modifications its licensee may 64f556842eSJung-uk Kim * make. 65f556842eSJung-uk Kim * 66f556842eSJung-uk Kim * 3.3. Redistribution of Executable. Redistribution in executable form of any 67f556842eSJung-uk Kim * substantial portion of the Covered Code or modification must reproduce the 68f556842eSJung-uk Kim * above Copyright Notice, and the following Disclaimer and Export Compliance 69f556842eSJung-uk Kim * provision in the documentation and/or other materials provided with the 70f556842eSJung-uk Kim * distribution. 71f556842eSJung-uk Kim * 72f556842eSJung-uk Kim * 3.4. Intel retains all right, title, and interest in and to the Original 73f556842eSJung-uk Kim * Intel Code. 74f556842eSJung-uk Kim * 75f556842eSJung-uk Kim * 3.5. Neither the name Intel nor any other trademark owned or controlled by 76f556842eSJung-uk Kim * Intel shall be used in advertising or otherwise to promote the sale, use or 77f556842eSJung-uk Kim * other dealings in products derived from or relating to the Covered Code 78f556842eSJung-uk Kim * without prior written authorization from Intel. 79f556842eSJung-uk Kim * 80f556842eSJung-uk Kim * 4. Disclaimer and Export Compliance 81f556842eSJung-uk Kim * 82f556842eSJung-uk Kim * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 83f556842eSJung-uk Kim * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 84f556842eSJung-uk Kim * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 85f556842eSJung-uk Kim * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 86f556842eSJung-uk Kim * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 87f556842eSJung-uk Kim * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 88f556842eSJung-uk Kim * PARTICULAR PURPOSE. 89f556842eSJung-uk Kim * 90f556842eSJung-uk Kim * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 91f556842eSJung-uk Kim * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 92f556842eSJung-uk Kim * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 93f556842eSJung-uk Kim * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 94f556842eSJung-uk Kim * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 95f556842eSJung-uk Kim * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 96f556842eSJung-uk Kim * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 97f556842eSJung-uk Kim * LIMITED REMEDY. 98f556842eSJung-uk Kim * 99f556842eSJung-uk Kim * 4.3. Licensee shall not export, either directly or indirectly, any of this 100f556842eSJung-uk Kim * software or system incorporating such software without first obtaining any 101f556842eSJung-uk Kim * required license or other approval from the U. S. Department of Commerce or 102f556842eSJung-uk Kim * any other agency or department of the United States Government. In the 103f556842eSJung-uk Kim * event Licensee exports any such software from the United States or 104f556842eSJung-uk Kim * re-exports any such software from a foreign destination, Licensee shall 105f556842eSJung-uk Kim * ensure that the distribution and export/re-export of the software is in 106f556842eSJung-uk Kim * compliance with all laws, regulations, orders, or other restrictions of the 107f556842eSJung-uk Kim * U.S. Export Administration Regulations. Licensee agrees that neither it nor 108f556842eSJung-uk Kim * any of its subsidiaries will export/re-export any technical data, process, 109f556842eSJung-uk Kim * software, or service, directly or indirectly, to any country for which the 110f556842eSJung-uk Kim * United States government or any agency thereof requires an export license, 111f556842eSJung-uk Kim * other governmental approval, or letter of assurance, without first obtaining 112f556842eSJung-uk Kim * such license, approval or letter. 113f556842eSJung-uk Kim * 114f556842eSJung-uk Kim *****************************************************************************/ 115f556842eSJung-uk Kim 116f556842eSJung-uk Kim #include <contrib/dev/acpica/include/acpi.h> 117f556842eSJung-uk Kim #include <contrib/dev/acpica/include/accommon.h> 118f556842eSJung-uk Kim #include <contrib/dev/acpica/include/amlcode.h> 119f556842eSJung-uk Kim #include <contrib/dev/acpica/include/acnamesp.h> 120f556842eSJung-uk Kim #include <contrib/dev/acpica/include/acdisasm.h> 121f556842eSJung-uk Kim 122f556842eSJung-uk Kim 123f556842eSJung-uk Kim /* 124f556842eSJung-uk Kim * This module is used for application-level code (iASL disassembler) only. 125f556842eSJung-uk Kim * 126f556842eSJung-uk Kim * It contains the code to create and emit any necessary External() ASL 127f556842eSJung-uk Kim * statements for the module being disassembled. 128f556842eSJung-uk Kim */ 129f556842eSJung-uk Kim #define _COMPONENT ACPI_CA_DISASSEMBLER 130f556842eSJung-uk Kim ACPI_MODULE_NAME ("dmextern") 131f556842eSJung-uk Kim 132f556842eSJung-uk Kim 133f556842eSJung-uk Kim /* 134f556842eSJung-uk Kim * This table maps ACPI_OBJECT_TYPEs to the corresponding ASL 135f556842eSJung-uk Kim * ObjectTypeKeyword. Used to generate typed external declarations 136f556842eSJung-uk Kim */ 137f556842eSJung-uk Kim static const char *AcpiGbl_DmTypeNames[] = 138f556842eSJung-uk Kim { 139f556842eSJung-uk Kim /* 00 */ "", /* Type ANY */ 140f556842eSJung-uk Kim /* 01 */ ", IntObj", 141f556842eSJung-uk Kim /* 02 */ ", StrObj", 142f556842eSJung-uk Kim /* 03 */ ", BuffObj", 143f556842eSJung-uk Kim /* 04 */ ", PkgObj", 144f556842eSJung-uk Kim /* 05 */ ", FieldUnitObj", 145f556842eSJung-uk Kim /* 06 */ ", DeviceObj", 146f556842eSJung-uk Kim /* 07 */ ", EventObj", 147f556842eSJung-uk Kim /* 08 */ ", MethodObj", 148f556842eSJung-uk Kim /* 09 */ ", MutexObj", 149f556842eSJung-uk Kim /* 10 */ ", OpRegionObj", 150f556842eSJung-uk Kim /* 11 */ ", PowerResObj", 151f556842eSJung-uk Kim /* 12 */ ", ProcessorObj", 152f556842eSJung-uk Kim /* 13 */ ", ThermalZoneObj", 153f556842eSJung-uk Kim /* 14 */ ", BuffFieldObj", 154f556842eSJung-uk Kim /* 15 */ ", DDBHandleObj", 155f556842eSJung-uk Kim /* 16 */ "", /* Debug object */ 156f556842eSJung-uk Kim /* 17 */ ", FieldUnitObj", 157f556842eSJung-uk Kim /* 18 */ ", FieldUnitObj", 158f556842eSJung-uk Kim /* 19 */ ", FieldUnitObj" 159f556842eSJung-uk Kim }; 160f556842eSJung-uk Kim 161f556842eSJung-uk Kim 162f556842eSJung-uk Kim /* Local prototypes */ 163f556842eSJung-uk Kim 164f556842eSJung-uk Kim static const char * 165f556842eSJung-uk Kim AcpiDmGetObjectTypeName ( 166f556842eSJung-uk Kim ACPI_OBJECT_TYPE Type); 167f556842eSJung-uk Kim 168f556842eSJung-uk Kim static char * 169f556842eSJung-uk Kim AcpiDmNormalizeParentPrefix ( 170f556842eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 171f556842eSJung-uk Kim char *Path); 172f556842eSJung-uk Kim 173f556842eSJung-uk Kim 174f556842eSJung-uk Kim /******************************************************************************* 175f556842eSJung-uk Kim * 176f556842eSJung-uk Kim * FUNCTION: AcpiDmGetObjectTypeName 177f556842eSJung-uk Kim * 178f556842eSJung-uk Kim * PARAMETERS: Type - An ACPI_OBJECT_TYPE 179f556842eSJung-uk Kim * 180f556842eSJung-uk Kim * RETURN: Pointer to a string 181f556842eSJung-uk Kim * 182f556842eSJung-uk Kim * DESCRIPTION: Map an object type to the ASL object type string. 183f556842eSJung-uk Kim * 184f556842eSJung-uk Kim ******************************************************************************/ 185f556842eSJung-uk Kim 186f556842eSJung-uk Kim static const char * 187f556842eSJung-uk Kim AcpiDmGetObjectTypeName ( 188f556842eSJung-uk Kim ACPI_OBJECT_TYPE Type) 189f556842eSJung-uk Kim { 190f556842eSJung-uk Kim 191f556842eSJung-uk Kim if (Type == ACPI_TYPE_LOCAL_SCOPE) 192f556842eSJung-uk Kim { 193f556842eSJung-uk Kim Type = ACPI_TYPE_DEVICE; 194f556842eSJung-uk Kim } 195f556842eSJung-uk Kim 196f556842eSJung-uk Kim else if (Type > ACPI_TYPE_LOCAL_INDEX_FIELD) 197f556842eSJung-uk Kim { 198f556842eSJung-uk Kim return (""); 199f556842eSJung-uk Kim } 200f556842eSJung-uk Kim 201f556842eSJung-uk Kim return (AcpiGbl_DmTypeNames[Type]); 202f556842eSJung-uk Kim } 203f556842eSJung-uk Kim 204f556842eSJung-uk Kim 205f556842eSJung-uk Kim /******************************************************************************* 206f556842eSJung-uk Kim * 207f556842eSJung-uk Kim * FUNCTION: AcpiDmNormalizeParentPrefix 208f556842eSJung-uk Kim * 209f556842eSJung-uk Kim * PARAMETERS: Op - Parse op 210f556842eSJung-uk Kim * Path - Path with parent prefix 211f556842eSJung-uk Kim * 212f556842eSJung-uk Kim * RETURN: The full pathname to the object (from the namespace root) 213f556842eSJung-uk Kim * 214f556842eSJung-uk Kim * DESCRIPTION: Returns the full pathname of a path with parent prefix 215f556842eSJung-uk Kim * The caller must free the fullpath returned. 216f556842eSJung-uk Kim * 217f556842eSJung-uk Kim ******************************************************************************/ 218f556842eSJung-uk Kim 219f556842eSJung-uk Kim static char * 220f556842eSJung-uk Kim AcpiDmNormalizeParentPrefix ( 221f556842eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 222f556842eSJung-uk Kim char *Path) 223f556842eSJung-uk Kim { 224f556842eSJung-uk Kim ACPI_NAMESPACE_NODE *Node; 225f556842eSJung-uk Kim char *Fullpath; 226f556842eSJung-uk Kim char *ParentPath; 227f556842eSJung-uk Kim ACPI_SIZE Length; 228f556842eSJung-uk Kim 229f556842eSJung-uk Kim 230f556842eSJung-uk Kim /* Search upwards in the parse tree until we reach a namespace node */ 231f556842eSJung-uk Kim 232f556842eSJung-uk Kim while (Op) 233f556842eSJung-uk Kim { 234f556842eSJung-uk Kim if (Op->Common.Node) 235f556842eSJung-uk Kim { 236f556842eSJung-uk Kim break; 237f556842eSJung-uk Kim } 238f556842eSJung-uk Kim 239f556842eSJung-uk Kim Op = Op->Common.Parent; 240f556842eSJung-uk Kim } 241f556842eSJung-uk Kim 242f556842eSJung-uk Kim if (!Op) 243f556842eSJung-uk Kim { 244f556842eSJung-uk Kim return (NULL); 245f556842eSJung-uk Kim } 246f556842eSJung-uk Kim 247f556842eSJung-uk Kim /* 248f556842eSJung-uk Kim * Find the actual parent node for the reference: 249f556842eSJung-uk Kim * Remove all carat prefixes from the input path. 250f556842eSJung-uk Kim * There may be multiple parent prefixes (For example, ^^^M000) 251f556842eSJung-uk Kim */ 252f556842eSJung-uk Kim Node = Op->Common.Node; 253f556842eSJung-uk Kim while (Node && (*Path == (UINT8) AML_PARENT_PREFIX)) 254f556842eSJung-uk Kim { 255a88e22b7SJung-uk Kim Node = Node->Parent; 256f556842eSJung-uk Kim Path++; 257f556842eSJung-uk Kim } 258f556842eSJung-uk Kim 259f556842eSJung-uk Kim if (!Node) 260f556842eSJung-uk Kim { 261f556842eSJung-uk Kim return (NULL); 262f556842eSJung-uk Kim } 263f556842eSJung-uk Kim 264f556842eSJung-uk Kim /* Get the full pathname for the parent node */ 265f556842eSJung-uk Kim 266f556842eSJung-uk Kim ParentPath = AcpiNsGetExternalPathname (Node); 267f556842eSJung-uk Kim if (!ParentPath) 268f556842eSJung-uk Kim { 269f556842eSJung-uk Kim return (NULL); 270f556842eSJung-uk Kim } 271f556842eSJung-uk Kim 272f556842eSJung-uk Kim Length = (ACPI_STRLEN (ParentPath) + ACPI_STRLEN (Path) + 1); 2738c8be05fSJung-uk Kim if (ParentPath[1]) 2748c8be05fSJung-uk Kim { 2758c8be05fSJung-uk Kim /* 2768c8be05fSJung-uk Kim * If ParentPath is not just a simple '\', increment the length 2778c8be05fSJung-uk Kim * for the required dot separator (ParentPath.Path) 2788c8be05fSJung-uk Kim */ 2798c8be05fSJung-uk Kim Length++; 2808c8be05fSJung-uk Kim } 2818c8be05fSJung-uk Kim 282f556842eSJung-uk Kim Fullpath = ACPI_ALLOCATE_ZEROED (Length); 283f556842eSJung-uk Kim if (!Fullpath) 284f556842eSJung-uk Kim { 285f556842eSJung-uk Kim goto Cleanup; 286f556842eSJung-uk Kim } 287f556842eSJung-uk Kim 288f556842eSJung-uk Kim /* 289f556842eSJung-uk Kim * Concatenate parent fullpath and path. For example, 290f556842eSJung-uk Kim * parent fullpath "\_SB_", Path "^INIT", Fullpath "\_SB_.INIT" 291f556842eSJung-uk Kim * 292f556842eSJung-uk Kim * Copy the parent path 293f556842eSJung-uk Kim */ 294f556842eSJung-uk Kim ACPI_STRCAT (Fullpath, ParentPath); 295f556842eSJung-uk Kim 296f556842eSJung-uk Kim /* Add dot separator (don't need dot if parent fullpath is a single "\") */ 297f556842eSJung-uk Kim 298f556842eSJung-uk Kim if (ParentPath[1]) 299f556842eSJung-uk Kim { 300f556842eSJung-uk Kim ACPI_STRCAT (Fullpath, "."); 301f556842eSJung-uk Kim } 302f556842eSJung-uk Kim 303f556842eSJung-uk Kim /* Copy child path (carat parent prefix(es) were skipped above) */ 304f556842eSJung-uk Kim 305f556842eSJung-uk Kim ACPI_STRCAT (Fullpath, Path); 306f556842eSJung-uk Kim 307f556842eSJung-uk Kim Cleanup: 308f556842eSJung-uk Kim ACPI_FREE (ParentPath); 309f556842eSJung-uk Kim return (Fullpath); 310f556842eSJung-uk Kim } 311f556842eSJung-uk Kim 312f556842eSJung-uk Kim 313f556842eSJung-uk Kim /******************************************************************************* 314f556842eSJung-uk Kim * 315*709fac06SJung-uk Kim * FUNCTION: AcpiDmAddToExternalFileList 316*709fac06SJung-uk Kim * 317*709fac06SJung-uk Kim * PARAMETERS: PathList - Single path or list separated by comma 318*709fac06SJung-uk Kim * 319*709fac06SJung-uk Kim * RETURN: None 320*709fac06SJung-uk Kim * 321*709fac06SJung-uk Kim * DESCRIPTION: Add external files to global list 322*709fac06SJung-uk Kim * 323*709fac06SJung-uk Kim ******************************************************************************/ 324*709fac06SJung-uk Kim 325*709fac06SJung-uk Kim ACPI_STATUS 326*709fac06SJung-uk Kim AcpiDmAddToExternalFileList ( 327*709fac06SJung-uk Kim char *PathList) 328*709fac06SJung-uk Kim { 329*709fac06SJung-uk Kim ACPI_EXTERNAL_FILE *ExternalFile; 330*709fac06SJung-uk Kim char *Path; 331*709fac06SJung-uk Kim char *TmpPath; 332*709fac06SJung-uk Kim 333*709fac06SJung-uk Kim 334*709fac06SJung-uk Kim if (!PathList) 335*709fac06SJung-uk Kim { 336*709fac06SJung-uk Kim return (AE_OK); 337*709fac06SJung-uk Kim } 338*709fac06SJung-uk Kim 339*709fac06SJung-uk Kim Path = strtok (PathList, ","); 340*709fac06SJung-uk Kim 341*709fac06SJung-uk Kim while (Path) 342*709fac06SJung-uk Kim { 343*709fac06SJung-uk Kim TmpPath = ACPI_ALLOCATE_ZEROED (ACPI_STRLEN (Path) + 1); 344*709fac06SJung-uk Kim if (!TmpPath) 345*709fac06SJung-uk Kim { 346*709fac06SJung-uk Kim return (AE_NO_MEMORY); 347*709fac06SJung-uk Kim } 348*709fac06SJung-uk Kim 349*709fac06SJung-uk Kim ACPI_STRCPY (TmpPath, Path); 350*709fac06SJung-uk Kim 351*709fac06SJung-uk Kim ExternalFile = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EXTERNAL_FILE)); 352*709fac06SJung-uk Kim if (!ExternalFile) 353*709fac06SJung-uk Kim { 354*709fac06SJung-uk Kim ACPI_FREE (TmpPath); 355*709fac06SJung-uk Kim return (AE_NO_MEMORY); 356*709fac06SJung-uk Kim } 357*709fac06SJung-uk Kim 358*709fac06SJung-uk Kim ExternalFile->Path = TmpPath; 359*709fac06SJung-uk Kim 360*709fac06SJung-uk Kim if (AcpiGbl_ExternalFileList) 361*709fac06SJung-uk Kim { 362*709fac06SJung-uk Kim ExternalFile->Next = AcpiGbl_ExternalFileList; 363*709fac06SJung-uk Kim } 364*709fac06SJung-uk Kim 365*709fac06SJung-uk Kim AcpiGbl_ExternalFileList = ExternalFile; 366*709fac06SJung-uk Kim Path = strtok (NULL, ","); 367*709fac06SJung-uk Kim } 368*709fac06SJung-uk Kim 369*709fac06SJung-uk Kim return (AE_OK); 370*709fac06SJung-uk Kim } 371*709fac06SJung-uk Kim 372*709fac06SJung-uk Kim 373*709fac06SJung-uk Kim /******************************************************************************* 374*709fac06SJung-uk Kim * 375*709fac06SJung-uk Kim * FUNCTION: AcpiDmClearExternalFileList 376*709fac06SJung-uk Kim * 377*709fac06SJung-uk Kim * PARAMETERS: None 378*709fac06SJung-uk Kim * 379*709fac06SJung-uk Kim * RETURN: None 380*709fac06SJung-uk Kim * 381*709fac06SJung-uk Kim * DESCRIPTION: Clear the external file list 382*709fac06SJung-uk Kim * 383*709fac06SJung-uk Kim ******************************************************************************/ 384*709fac06SJung-uk Kim 385*709fac06SJung-uk Kim void 386*709fac06SJung-uk Kim AcpiDmClearExternalFileList ( 387*709fac06SJung-uk Kim void) 388*709fac06SJung-uk Kim { 389*709fac06SJung-uk Kim ACPI_EXTERNAL_FILE *NextExternal; 390*709fac06SJung-uk Kim 391*709fac06SJung-uk Kim 392*709fac06SJung-uk Kim while (AcpiGbl_ExternalFileList) 393*709fac06SJung-uk Kim { 394*709fac06SJung-uk Kim NextExternal = AcpiGbl_ExternalFileList->Next; 395*709fac06SJung-uk Kim ACPI_FREE (AcpiGbl_ExternalFileList->Path); 396*709fac06SJung-uk Kim ACPI_FREE (AcpiGbl_ExternalFileList); 397*709fac06SJung-uk Kim AcpiGbl_ExternalFileList = NextExternal; 398*709fac06SJung-uk Kim } 399*709fac06SJung-uk Kim } 400*709fac06SJung-uk Kim 401*709fac06SJung-uk Kim 402*709fac06SJung-uk Kim /******************************************************************************* 403*709fac06SJung-uk Kim * 404f556842eSJung-uk Kim * FUNCTION: AcpiDmAddToExternalList 405f556842eSJung-uk Kim * 406f556842eSJung-uk Kim * PARAMETERS: Op - Current parser Op 407f556842eSJung-uk Kim * Path - Internal (AML) path to the object 408f556842eSJung-uk Kim * Type - ACPI object type to be added 409f556842eSJung-uk Kim * Value - Arg count if adding a Method object 410f556842eSJung-uk Kim * 411f556842eSJung-uk Kim * RETURN: None 412f556842eSJung-uk Kim * 413f556842eSJung-uk Kim * DESCRIPTION: Insert a new name into the global list of Externals which 414f556842eSJung-uk Kim * will in turn be later emitted as an External() declaration 415f556842eSJung-uk Kim * in the disassembled output. 416f556842eSJung-uk Kim * 417f556842eSJung-uk Kim ******************************************************************************/ 418f556842eSJung-uk Kim 419f556842eSJung-uk Kim void 420f556842eSJung-uk Kim AcpiDmAddToExternalList ( 421f556842eSJung-uk Kim ACPI_PARSE_OBJECT *Op, 422f556842eSJung-uk Kim char *Path, 423f556842eSJung-uk Kim UINT8 Type, 424f556842eSJung-uk Kim UINT32 Value) 425f556842eSJung-uk Kim { 426f556842eSJung-uk Kim char *ExternalPath; 427f556842eSJung-uk Kim char *Fullpath = NULL; 428f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *NewExternal; 429f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *NextExternal; 430f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *PrevExternal = NULL; 431f556842eSJung-uk Kim ACPI_STATUS Status; 432f556842eSJung-uk Kim 433f556842eSJung-uk Kim 434f556842eSJung-uk Kim if (!Path) 435f556842eSJung-uk Kim { 436f556842eSJung-uk Kim return; 437f556842eSJung-uk Kim } 438f556842eSJung-uk Kim 439f556842eSJung-uk Kim /* Externalize the ACPI path */ 440f556842eSJung-uk Kim 441f556842eSJung-uk Kim Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, Path, 442f556842eSJung-uk Kim NULL, &ExternalPath); 443f556842eSJung-uk Kim if (ACPI_FAILURE (Status)) 444f556842eSJung-uk Kim { 445f556842eSJung-uk Kim return; 446f556842eSJung-uk Kim } 447f556842eSJung-uk Kim 448f556842eSJung-uk Kim /* Get the full pathname from root if "Path" has a parent prefix */ 449f556842eSJung-uk Kim 450f556842eSJung-uk Kim if (*Path == (UINT8) AML_PARENT_PREFIX) 451f556842eSJung-uk Kim { 452f556842eSJung-uk Kim Fullpath = AcpiDmNormalizeParentPrefix (Op, ExternalPath); 453f556842eSJung-uk Kim if (Fullpath) 454f556842eSJung-uk Kim { 455f556842eSJung-uk Kim /* Set new external path */ 456f556842eSJung-uk Kim 457f556842eSJung-uk Kim ACPI_FREE (ExternalPath); 458f556842eSJung-uk Kim ExternalPath = Fullpath; 459f556842eSJung-uk Kim } 460f556842eSJung-uk Kim } 461f556842eSJung-uk Kim 462f556842eSJung-uk Kim /* Check all existing externals to ensure no duplicates */ 463f556842eSJung-uk Kim 464f556842eSJung-uk Kim NextExternal = AcpiGbl_ExternalList; 465f556842eSJung-uk Kim while (NextExternal) 466f556842eSJung-uk Kim { 467f556842eSJung-uk Kim if (!ACPI_STRCMP (ExternalPath, NextExternal->Path)) 468f556842eSJung-uk Kim { 469f556842eSJung-uk Kim /* Duplicate method, check that the Value (ArgCount) is the same */ 470f556842eSJung-uk Kim 471f556842eSJung-uk Kim if ((NextExternal->Type == ACPI_TYPE_METHOD) && 472f556842eSJung-uk Kim (NextExternal->Value != Value)) 473f556842eSJung-uk Kim { 474f556842eSJung-uk Kim ACPI_ERROR ((AE_INFO, 475ca3cf4faSJung-uk Kim "Argument count mismatch for method %s %u %u", 476f556842eSJung-uk Kim NextExternal->Path, NextExternal->Value, Value)); 477f556842eSJung-uk Kim } 478f556842eSJung-uk Kim 479f556842eSJung-uk Kim /* Allow upgrade of type from ANY */ 480f556842eSJung-uk Kim 481f556842eSJung-uk Kim else if (NextExternal->Type == ACPI_TYPE_ANY) 482f556842eSJung-uk Kim { 483f556842eSJung-uk Kim NextExternal->Type = Type; 484f556842eSJung-uk Kim NextExternal->Value = Value; 485f556842eSJung-uk Kim } 486f556842eSJung-uk Kim 487f556842eSJung-uk Kim ACPI_FREE (ExternalPath); 488f556842eSJung-uk Kim return; 489f556842eSJung-uk Kim } 490f556842eSJung-uk Kim 491f556842eSJung-uk Kim NextExternal = NextExternal->Next; 492f556842eSJung-uk Kim } 493f556842eSJung-uk Kim 494f556842eSJung-uk Kim /* Allocate and init a new External() descriptor */ 495f556842eSJung-uk Kim 496f556842eSJung-uk Kim NewExternal = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EXTERNAL_LIST)); 497f556842eSJung-uk Kim if (!NewExternal) 498f556842eSJung-uk Kim { 499f556842eSJung-uk Kim ACPI_FREE (ExternalPath); 500f556842eSJung-uk Kim return; 501f556842eSJung-uk Kim } 502f556842eSJung-uk Kim 503f556842eSJung-uk Kim NewExternal->Path = ExternalPath; 504f556842eSJung-uk Kim NewExternal->Type = Type; 505f556842eSJung-uk Kim NewExternal->Value = Value; 506f556842eSJung-uk Kim NewExternal->Length = (UINT16) ACPI_STRLEN (ExternalPath); 507f556842eSJung-uk Kim 508f556842eSJung-uk Kim /* Was the external path with parent prefix normalized to a fullpath? */ 509f556842eSJung-uk Kim 510f556842eSJung-uk Kim if (Fullpath == ExternalPath) 511f556842eSJung-uk Kim { 512f556842eSJung-uk Kim /* Get new internal path */ 513f556842eSJung-uk Kim 514f556842eSJung-uk Kim Status = AcpiNsInternalizeName (ExternalPath, &Path); 515f556842eSJung-uk Kim if (ACPI_FAILURE (Status)) 516f556842eSJung-uk Kim { 517f556842eSJung-uk Kim ACPI_FREE (ExternalPath); 518f556842eSJung-uk Kim ACPI_FREE (NewExternal); 519f556842eSJung-uk Kim return; 520f556842eSJung-uk Kim } 521f556842eSJung-uk Kim 522f556842eSJung-uk Kim /* Set flag to indicate External->InternalPath need to be freed */ 523f556842eSJung-uk Kim 524f556842eSJung-uk Kim NewExternal->Flags |= ACPI_IPATH_ALLOCATED; 525f556842eSJung-uk Kim } 526f556842eSJung-uk Kim 527f556842eSJung-uk Kim NewExternal->InternalPath = Path; 528f556842eSJung-uk Kim 529f556842eSJung-uk Kim /* Link the new descriptor into the global list, ordered by string length */ 530f556842eSJung-uk Kim 531f556842eSJung-uk Kim NextExternal = AcpiGbl_ExternalList; 532f556842eSJung-uk Kim while (NextExternal) 533f556842eSJung-uk Kim { 534f556842eSJung-uk Kim if (NewExternal->Length <= NextExternal->Length) 535f556842eSJung-uk Kim { 536f556842eSJung-uk Kim if (PrevExternal) 537f556842eSJung-uk Kim { 538f556842eSJung-uk Kim PrevExternal->Next = NewExternal; 539f556842eSJung-uk Kim } 540f556842eSJung-uk Kim else 541f556842eSJung-uk Kim { 542f556842eSJung-uk Kim AcpiGbl_ExternalList = NewExternal; 543f556842eSJung-uk Kim } 544f556842eSJung-uk Kim 545f556842eSJung-uk Kim NewExternal->Next = NextExternal; 546f556842eSJung-uk Kim return; 547f556842eSJung-uk Kim } 548f556842eSJung-uk Kim 549f556842eSJung-uk Kim PrevExternal = NextExternal; 550f556842eSJung-uk Kim NextExternal = NextExternal->Next; 551f556842eSJung-uk Kim } 552f556842eSJung-uk Kim 553f556842eSJung-uk Kim if (PrevExternal) 554f556842eSJung-uk Kim { 555f556842eSJung-uk Kim PrevExternal->Next = NewExternal; 556f556842eSJung-uk Kim } 557f556842eSJung-uk Kim else 558f556842eSJung-uk Kim { 559f556842eSJung-uk Kim AcpiGbl_ExternalList = NewExternal; 560f556842eSJung-uk Kim } 561f556842eSJung-uk Kim } 562f556842eSJung-uk Kim 563f556842eSJung-uk Kim 564f556842eSJung-uk Kim /******************************************************************************* 565f556842eSJung-uk Kim * 566f556842eSJung-uk Kim * FUNCTION: AcpiDmAddExternalsToNamespace 567f556842eSJung-uk Kim * 568f556842eSJung-uk Kim * PARAMETERS: None 569f556842eSJung-uk Kim * 570f556842eSJung-uk Kim * RETURN: None 571f556842eSJung-uk Kim * 572f556842eSJung-uk Kim * DESCRIPTION: Add all externals to the namespace. Allows externals to be 573f556842eSJung-uk Kim * "resolved". 574f556842eSJung-uk Kim * 575f556842eSJung-uk Kim ******************************************************************************/ 576f556842eSJung-uk Kim 577f556842eSJung-uk Kim void 578f556842eSJung-uk Kim AcpiDmAddExternalsToNamespace ( 579f556842eSJung-uk Kim void) 580f556842eSJung-uk Kim { 581f556842eSJung-uk Kim ACPI_STATUS Status; 582f556842eSJung-uk Kim ACPI_NAMESPACE_NODE *Node; 583f556842eSJung-uk Kim ACPI_OPERAND_OBJECT *MethodDesc; 584f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *External = AcpiGbl_ExternalList; 585f556842eSJung-uk Kim 586f556842eSJung-uk Kim 587f556842eSJung-uk Kim while (External) 588f556842eSJung-uk Kim { 589f556842eSJung-uk Kim /* Add the external name (object) into the namespace */ 590f556842eSJung-uk Kim 591f556842eSJung-uk Kim Status = AcpiNsLookup (NULL, External->InternalPath, External->Type, 592f556842eSJung-uk Kim ACPI_IMODE_LOAD_PASS1, 593f556842eSJung-uk Kim ACPI_NS_EXTERNAL | ACPI_NS_DONT_OPEN_SCOPE, 594f556842eSJung-uk Kim NULL, &Node); 595f556842eSJung-uk Kim 596f556842eSJung-uk Kim if (ACPI_FAILURE (Status)) 597f556842eSJung-uk Kim { 598f556842eSJung-uk Kim ACPI_EXCEPTION ((AE_INFO, Status, 599f556842eSJung-uk Kim "while adding external to namespace [%s]", 600f556842eSJung-uk Kim External->Path)); 601f556842eSJung-uk Kim } 602f556842eSJung-uk Kim else if (External->Type == ACPI_TYPE_METHOD) 603f556842eSJung-uk Kim { 604f556842eSJung-uk Kim /* For methods, we need to save the argument count */ 605f556842eSJung-uk Kim 606f556842eSJung-uk Kim MethodDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD); 607f556842eSJung-uk Kim MethodDesc->Method.ParamCount = (UINT8) External->Value; 608f556842eSJung-uk Kim Node->Object = MethodDesc; 609f556842eSJung-uk Kim } 610f556842eSJung-uk Kim 611f556842eSJung-uk Kim External = External->Next; 612f556842eSJung-uk Kim } 613f556842eSJung-uk Kim } 614f556842eSJung-uk Kim 615f556842eSJung-uk Kim 616f556842eSJung-uk Kim /******************************************************************************* 617f556842eSJung-uk Kim * 618f556842eSJung-uk Kim * FUNCTION: AcpiDmGetExternalMethodCount 619f556842eSJung-uk Kim * 620f556842eSJung-uk Kim * PARAMETERS: None 621f556842eSJung-uk Kim * 622f556842eSJung-uk Kim * RETURN: The number of control method externals in the external list 623f556842eSJung-uk Kim * 624f556842eSJung-uk Kim * DESCRIPTION: Return the number of method externals that have been generated. 625f556842eSJung-uk Kim * If any control method externals have been found, we must 626f556842eSJung-uk Kim * re-parse the entire definition block with the new information 627f556842eSJung-uk Kim * (number of arguments for the methods.) This is limitation of 628f556842eSJung-uk Kim * AML, we don't know the number of arguments from the control 629f556842eSJung-uk Kim * method invocation itself. 630f556842eSJung-uk Kim * 631f556842eSJung-uk Kim ******************************************************************************/ 632f556842eSJung-uk Kim 633f556842eSJung-uk Kim UINT32 634f556842eSJung-uk Kim AcpiDmGetExternalMethodCount ( 635f556842eSJung-uk Kim void) 636f556842eSJung-uk Kim { 637f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *External = AcpiGbl_ExternalList; 638f556842eSJung-uk Kim UINT32 Count = 0; 639f556842eSJung-uk Kim 640f556842eSJung-uk Kim 641f556842eSJung-uk Kim while (External) 642f556842eSJung-uk Kim { 643f556842eSJung-uk Kim if (External->Type == ACPI_TYPE_METHOD) 644f556842eSJung-uk Kim { 645f556842eSJung-uk Kim Count++; 646f556842eSJung-uk Kim } 647f556842eSJung-uk Kim 648f556842eSJung-uk Kim External = External->Next; 649f556842eSJung-uk Kim } 650f556842eSJung-uk Kim 651f556842eSJung-uk Kim return (Count); 652f556842eSJung-uk Kim } 653f556842eSJung-uk Kim 654f556842eSJung-uk Kim 655f556842eSJung-uk Kim /******************************************************************************* 656f556842eSJung-uk Kim * 657f556842eSJung-uk Kim * FUNCTION: AcpiDmClearExternalList 658f556842eSJung-uk Kim * 659f556842eSJung-uk Kim * PARAMETERS: None 660f556842eSJung-uk Kim * 661f556842eSJung-uk Kim * RETURN: None 662f556842eSJung-uk Kim * 663f556842eSJung-uk Kim * DESCRIPTION: Free the entire External info list 664f556842eSJung-uk Kim * 665f556842eSJung-uk Kim ******************************************************************************/ 666f556842eSJung-uk Kim 667f556842eSJung-uk Kim void 668f556842eSJung-uk Kim AcpiDmClearExternalList ( 669f556842eSJung-uk Kim void) 670f556842eSJung-uk Kim { 671f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *NextExternal; 672f556842eSJung-uk Kim 673f556842eSJung-uk Kim 674f556842eSJung-uk Kim while (AcpiGbl_ExternalList) 675f556842eSJung-uk Kim { 676f556842eSJung-uk Kim NextExternal = AcpiGbl_ExternalList->Next; 677f556842eSJung-uk Kim ACPI_FREE (AcpiGbl_ExternalList->Path); 678f556842eSJung-uk Kim ACPI_FREE (AcpiGbl_ExternalList); 679f556842eSJung-uk Kim AcpiGbl_ExternalList = NextExternal; 680f556842eSJung-uk Kim } 681f556842eSJung-uk Kim } 682f556842eSJung-uk Kim 683f556842eSJung-uk Kim 684f556842eSJung-uk Kim /******************************************************************************* 685f556842eSJung-uk Kim * 686f556842eSJung-uk Kim * FUNCTION: AcpiDmEmitExternals 687f556842eSJung-uk Kim * 688f556842eSJung-uk Kim * PARAMETERS: None 689f556842eSJung-uk Kim * 690f556842eSJung-uk Kim * RETURN: None 691f556842eSJung-uk Kim * 692f556842eSJung-uk Kim * DESCRIPTION: Emit an External() ASL statement for each of the externals in 693f556842eSJung-uk Kim * the global external info list. 694f556842eSJung-uk Kim * 695f556842eSJung-uk Kim ******************************************************************************/ 696f556842eSJung-uk Kim 697f556842eSJung-uk Kim void 698f556842eSJung-uk Kim AcpiDmEmitExternals ( 699f556842eSJung-uk Kim void) 700f556842eSJung-uk Kim { 701f556842eSJung-uk Kim ACPI_EXTERNAL_LIST *NextExternal; 702f556842eSJung-uk Kim 703f556842eSJung-uk Kim 704f556842eSJung-uk Kim if (!AcpiGbl_ExternalList) 705f556842eSJung-uk Kim { 706f556842eSJung-uk Kim return; 707f556842eSJung-uk Kim } 708f556842eSJung-uk Kim 709f556842eSJung-uk Kim /* 710f556842eSJung-uk Kim * Walk the list of externals (unresolved references) 711f556842eSJung-uk Kim * found during the AML parsing 712f556842eSJung-uk Kim */ 713f556842eSJung-uk Kim while (AcpiGbl_ExternalList) 714f556842eSJung-uk Kim { 715f556842eSJung-uk Kim AcpiOsPrintf (" External (%s%s", 716f556842eSJung-uk Kim AcpiGbl_ExternalList->Path, 717f556842eSJung-uk Kim AcpiDmGetObjectTypeName (AcpiGbl_ExternalList->Type)); 718f556842eSJung-uk Kim 719f556842eSJung-uk Kim if (AcpiGbl_ExternalList->Type == ACPI_TYPE_METHOD) 720f556842eSJung-uk Kim { 721a88e22b7SJung-uk Kim AcpiOsPrintf (") // %u Arguments\n", 722f556842eSJung-uk Kim AcpiGbl_ExternalList->Value); 723f556842eSJung-uk Kim } 724f556842eSJung-uk Kim else 725f556842eSJung-uk Kim { 726f556842eSJung-uk Kim AcpiOsPrintf (")\n"); 727f556842eSJung-uk Kim } 728f556842eSJung-uk Kim 729f556842eSJung-uk Kim /* Free this external info block and move on to next external */ 730f556842eSJung-uk Kim 731f556842eSJung-uk Kim NextExternal = AcpiGbl_ExternalList->Next; 732f556842eSJung-uk Kim if (AcpiGbl_ExternalList->Flags & ACPI_IPATH_ALLOCATED) 733f556842eSJung-uk Kim { 734f556842eSJung-uk Kim ACPI_FREE (AcpiGbl_ExternalList->InternalPath); 735f556842eSJung-uk Kim } 736f556842eSJung-uk Kim 737f556842eSJung-uk Kim ACPI_FREE (AcpiGbl_ExternalList->Path); 738f556842eSJung-uk Kim ACPI_FREE (AcpiGbl_ExternalList); 739f556842eSJung-uk Kim AcpiGbl_ExternalList = NextExternal; 740f556842eSJung-uk Kim } 741f556842eSJung-uk Kim 742f556842eSJung-uk Kim AcpiOsPrintf ("\n"); 743f556842eSJung-uk Kim } 744f556842eSJung-uk Kim 745