19980SDana.Myers@Sun.COM /****************************************************************************** 29980SDana.Myers@Sun.COM * 39980SDana.Myers@Sun.COM * Module Name: nspredef - Validation of ACPI predefined methods and objects 49980SDana.Myers@Sun.COM * 59980SDana.Myers@Sun.COM *****************************************************************************/ 69980SDana.Myers@Sun.COM 79980SDana.Myers@Sun.COM /****************************************************************************** 89980SDana.Myers@Sun.COM * 99980SDana.Myers@Sun.COM * 1. Copyright Notice 109980SDana.Myers@Sun.COM * 119980SDana.Myers@Sun.COM * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp. 129980SDana.Myers@Sun.COM * All rights reserved. 139980SDana.Myers@Sun.COM * 149980SDana.Myers@Sun.COM * 2. License 159980SDana.Myers@Sun.COM * 169980SDana.Myers@Sun.COM * 2.1. This is your license from Intel Corp. under its intellectual property 179980SDana.Myers@Sun.COM * rights. You may have additional license terms from the party that provided 189980SDana.Myers@Sun.COM * you this software, covering your right to use that party's intellectual 199980SDana.Myers@Sun.COM * property rights. 209980SDana.Myers@Sun.COM * 219980SDana.Myers@Sun.COM * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a 229980SDana.Myers@Sun.COM * copy of the source code appearing in this file ("Covered Code") an 239980SDana.Myers@Sun.COM * irrevocable, perpetual, worldwide license under Intel's copyrights in the 249980SDana.Myers@Sun.COM * base code distributed originally by Intel ("Original Intel Code") to copy, 259980SDana.Myers@Sun.COM * make derivatives, distribute, use and display any portion of the Covered 269980SDana.Myers@Sun.COM * Code in any form, with the right to sublicense such rights; and 279980SDana.Myers@Sun.COM * 289980SDana.Myers@Sun.COM * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent 299980SDana.Myers@Sun.COM * license (with the right to sublicense), under only those claims of Intel 309980SDana.Myers@Sun.COM * patents that are infringed by the Original Intel Code, to make, use, sell, 319980SDana.Myers@Sun.COM * offer to sell, and import the Covered Code and derivative works thereof 329980SDana.Myers@Sun.COM * solely to the minimum extent necessary to exercise the above copyright 339980SDana.Myers@Sun.COM * license, and in no event shall the patent license extend to any additions 349980SDana.Myers@Sun.COM * to or modifications of the Original Intel Code. No other license or right 359980SDana.Myers@Sun.COM * is granted directly or by implication, estoppel or otherwise; 369980SDana.Myers@Sun.COM * 379980SDana.Myers@Sun.COM * The above copyright and patent license is granted only if the following 389980SDana.Myers@Sun.COM * conditions are met: 399980SDana.Myers@Sun.COM * 409980SDana.Myers@Sun.COM * 3. Conditions 419980SDana.Myers@Sun.COM * 429980SDana.Myers@Sun.COM * 3.1. Redistribution of Source with Rights to Further Distribute Source. 439980SDana.Myers@Sun.COM * Redistribution of source code of any substantial portion of the Covered 449980SDana.Myers@Sun.COM * Code or modification with rights to further distribute source must include 459980SDana.Myers@Sun.COM * the above Copyright Notice, the above License, this list of Conditions, 469980SDana.Myers@Sun.COM * and the following Disclaimer and Export Compliance provision. In addition, 479980SDana.Myers@Sun.COM * Licensee must cause all Covered Code to which Licensee contributes to 489980SDana.Myers@Sun.COM * contain a file documenting the changes Licensee made to create that Covered 499980SDana.Myers@Sun.COM * Code and the date of any change. Licensee must include in that file the 509980SDana.Myers@Sun.COM * documentation of any changes made by any predecessor Licensee. Licensee 519980SDana.Myers@Sun.COM * must include a prominent statement that the modification is derived, 529980SDana.Myers@Sun.COM * directly or indirectly, from Original Intel Code. 539980SDana.Myers@Sun.COM * 549980SDana.Myers@Sun.COM * 3.2. Redistribution of Source with no Rights to Further Distribute Source. 559980SDana.Myers@Sun.COM * Redistribution of source code of any substantial portion of the Covered 569980SDana.Myers@Sun.COM * Code or modification without rights to further distribute source must 579980SDana.Myers@Sun.COM * include the following Disclaimer and Export Compliance provision in the 589980SDana.Myers@Sun.COM * documentation and/or other materials provided with distribution. In 599980SDana.Myers@Sun.COM * addition, Licensee may not authorize further sublicense of source of any 609980SDana.Myers@Sun.COM * portion of the Covered Code, and must include terms to the effect that the 619980SDana.Myers@Sun.COM * license from Licensee to its licensee is limited to the intellectual 629980SDana.Myers@Sun.COM * property embodied in the software Licensee provides to its licensee, and 639980SDana.Myers@Sun.COM * not to intellectual property embodied in modifications its licensee may 649980SDana.Myers@Sun.COM * make. 659980SDana.Myers@Sun.COM * 669980SDana.Myers@Sun.COM * 3.3. Redistribution of Executable. Redistribution in executable form of any 679980SDana.Myers@Sun.COM * substantial portion of the Covered Code or modification must reproduce the 689980SDana.Myers@Sun.COM * above Copyright Notice, and the following Disclaimer and Export Compliance 699980SDana.Myers@Sun.COM * provision in the documentation and/or other materials provided with the 709980SDana.Myers@Sun.COM * distribution. 719980SDana.Myers@Sun.COM * 729980SDana.Myers@Sun.COM * 3.4. Intel retains all right, title, and interest in and to the Original 739980SDana.Myers@Sun.COM * Intel Code. 749980SDana.Myers@Sun.COM * 759980SDana.Myers@Sun.COM * 3.5. Neither the name Intel nor any other trademark owned or controlled by 769980SDana.Myers@Sun.COM * Intel shall be used in advertising or otherwise to promote the sale, use or 779980SDana.Myers@Sun.COM * other dealings in products derived from or relating to the Covered Code 789980SDana.Myers@Sun.COM * without prior written authorization from Intel. 799980SDana.Myers@Sun.COM * 809980SDana.Myers@Sun.COM * 4. Disclaimer and Export Compliance 819980SDana.Myers@Sun.COM * 829980SDana.Myers@Sun.COM * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED 839980SDana.Myers@Sun.COM * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE 849980SDana.Myers@Sun.COM * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE, 859980SDana.Myers@Sun.COM * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY 869980SDana.Myers@Sun.COM * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY 879980SDana.Myers@Sun.COM * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A 889980SDana.Myers@Sun.COM * PARTICULAR PURPOSE. 899980SDana.Myers@Sun.COM * 909980SDana.Myers@Sun.COM * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES 919980SDana.Myers@Sun.COM * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR 929980SDana.Myers@Sun.COM * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT, 939980SDana.Myers@Sun.COM * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY 949980SDana.Myers@Sun.COM * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL 959980SDana.Myers@Sun.COM * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS 969980SDana.Myers@Sun.COM * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY 979980SDana.Myers@Sun.COM * LIMITED REMEDY. 989980SDana.Myers@Sun.COM * 999980SDana.Myers@Sun.COM * 4.3. Licensee shall not export, either directly or indirectly, any of this 1009980SDana.Myers@Sun.COM * software or system incorporating such software without first obtaining any 1019980SDana.Myers@Sun.COM * required license or other approval from the U. S. Department of Commerce or 1029980SDana.Myers@Sun.COM * any other agency or department of the United States Government. In the 1039980SDana.Myers@Sun.COM * event Licensee exports any such software from the United States or 1049980SDana.Myers@Sun.COM * re-exports any such software from a foreign destination, Licensee shall 1059980SDana.Myers@Sun.COM * ensure that the distribution and export/re-export of the software is in 1069980SDana.Myers@Sun.COM * compliance with all laws, regulations, orders, or other restrictions of the 1079980SDana.Myers@Sun.COM * U.S. Export Administration Regulations. Licensee agrees that neither it nor 1089980SDana.Myers@Sun.COM * any of its subsidiaries will export/re-export any technical data, process, 1099980SDana.Myers@Sun.COM * software, or service, directly or indirectly, to any country for which the 1109980SDana.Myers@Sun.COM * United States government or any agency thereof requires an export license, 1119980SDana.Myers@Sun.COM * other governmental approval, or letter of assurance, without first obtaining 1129980SDana.Myers@Sun.COM * such license, approval or letter. 1139980SDana.Myers@Sun.COM * 1149980SDana.Myers@Sun.COM *****************************************************************************/ 1159980SDana.Myers@Sun.COM 116*11225SDana.Myers@Sun.COM #define ACPI_CREATE_PREDEFINED_TABLE 1179980SDana.Myers@Sun.COM 1189980SDana.Myers@Sun.COM #include "acpi.h" 1199980SDana.Myers@Sun.COM #include "accommon.h" 1209980SDana.Myers@Sun.COM #include "acnamesp.h" 1219980SDana.Myers@Sun.COM #include "acpredef.h" 1229980SDana.Myers@Sun.COM 1239980SDana.Myers@Sun.COM 1249980SDana.Myers@Sun.COM #define _COMPONENT ACPI_NAMESPACE 1259980SDana.Myers@Sun.COM ACPI_MODULE_NAME ("nspredef") 1269980SDana.Myers@Sun.COM 1279980SDana.Myers@Sun.COM 1289980SDana.Myers@Sun.COM /******************************************************************************* 1299980SDana.Myers@Sun.COM * 1309980SDana.Myers@Sun.COM * This module validates predefined ACPI objects that appear in the namespace, 1319980SDana.Myers@Sun.COM * at the time they are evaluated (via AcpiEvaluateObject). The purpose of this 1329980SDana.Myers@Sun.COM * validation is to detect problems with BIOS-exposed predefined ACPI objects 1339980SDana.Myers@Sun.COM * before the results are returned to the ACPI-related drivers. 1349980SDana.Myers@Sun.COM * 1359980SDana.Myers@Sun.COM * There are several areas that are validated: 1369980SDana.Myers@Sun.COM * 1379980SDana.Myers@Sun.COM * 1) The number of input arguments as defined by the method/object in the 1389980SDana.Myers@Sun.COM * ASL is validated against the ACPI specification. 1399980SDana.Myers@Sun.COM * 2) The type of the return object (if any) is validated against the ACPI 1409980SDana.Myers@Sun.COM * specification. 1419980SDana.Myers@Sun.COM * 3) For returned package objects, the count of package elements is 1429980SDana.Myers@Sun.COM * validated, as well as the type of each package element. Nested 1439980SDana.Myers@Sun.COM * packages are supported. 1449980SDana.Myers@Sun.COM * 1459980SDana.Myers@Sun.COM * For any problems found, a warning message is issued. 1469980SDana.Myers@Sun.COM * 1479980SDana.Myers@Sun.COM ******************************************************************************/ 1489980SDana.Myers@Sun.COM 149*11225SDana.Myers@Sun.COM 1509980SDana.Myers@Sun.COM /* Local prototypes */ 1519980SDana.Myers@Sun.COM 1529980SDana.Myers@Sun.COM static ACPI_STATUS 1539980SDana.Myers@Sun.COM AcpiNsCheckPackage ( 154*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data, 155*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ReturnObjectPtr); 156*11225SDana.Myers@Sun.COM 157*11225SDana.Myers@Sun.COM static ACPI_STATUS 158*11225SDana.Myers@Sun.COM AcpiNsCheckPackageList ( 159*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data, 160*11225SDana.Myers@Sun.COM const ACPI_PREDEFINED_INFO *Package, 161*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **Elements, 162*11225SDana.Myers@Sun.COM UINT32 Count); 1639980SDana.Myers@Sun.COM 1649980SDana.Myers@Sun.COM static ACPI_STATUS 1659980SDana.Myers@Sun.COM AcpiNsCheckPackageElements ( 166*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data, 1679980SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **Elements, 1689980SDana.Myers@Sun.COM UINT8 Type1, 1699980SDana.Myers@Sun.COM UINT32 Count1, 1709980SDana.Myers@Sun.COM UINT8 Type2, 1719980SDana.Myers@Sun.COM UINT32 Count2, 1729980SDana.Myers@Sun.COM UINT32 StartIndex); 1739980SDana.Myers@Sun.COM 1749980SDana.Myers@Sun.COM static ACPI_STATUS 1759980SDana.Myers@Sun.COM AcpiNsCheckObjectType ( 176*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data, 1779980SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ReturnObjectPtr, 1789980SDana.Myers@Sun.COM UINT32 ExpectedBtypes, 1799980SDana.Myers@Sun.COM UINT32 PackageIndex); 1809980SDana.Myers@Sun.COM 1819980SDana.Myers@Sun.COM static ACPI_STATUS 1829980SDana.Myers@Sun.COM AcpiNsCheckReference ( 183*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data, 1849980SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ReturnObject); 1859980SDana.Myers@Sun.COM 186*11225SDana.Myers@Sun.COM static void 187*11225SDana.Myers@Sun.COM AcpiNsGetExpectedTypes ( 188*11225SDana.Myers@Sun.COM char *Buffer, 189*11225SDana.Myers@Sun.COM UINT32 ExpectedBtypes); 1909980SDana.Myers@Sun.COM 1919980SDana.Myers@Sun.COM /* 1929980SDana.Myers@Sun.COM * Names for the types that can be returned by the predefined objects. 1939980SDana.Myers@Sun.COM * Used for warning messages. Must be in the same order as the ACPI_RTYPEs 1949980SDana.Myers@Sun.COM */ 1959980SDana.Myers@Sun.COM static const char *AcpiRtypeNames[] = 1969980SDana.Myers@Sun.COM { 1979980SDana.Myers@Sun.COM "/Integer", 1989980SDana.Myers@Sun.COM "/String", 1999980SDana.Myers@Sun.COM "/Buffer", 2009980SDana.Myers@Sun.COM "/Package", 2019980SDana.Myers@Sun.COM "/Reference", 2029980SDana.Myers@Sun.COM }; 2039980SDana.Myers@Sun.COM 2049980SDana.Myers@Sun.COM 2059980SDana.Myers@Sun.COM /******************************************************************************* 2069980SDana.Myers@Sun.COM * 2079980SDana.Myers@Sun.COM * FUNCTION: AcpiNsCheckPredefinedNames 2089980SDana.Myers@Sun.COM * 2099980SDana.Myers@Sun.COM * PARAMETERS: Node - Namespace node for the method/object 210*11225SDana.Myers@Sun.COM * UserParamCount - Number of parameters actually passed 211*11225SDana.Myers@Sun.COM * ReturnStatus - Status from the object evaluation 2129980SDana.Myers@Sun.COM * ReturnObjectPtr - Pointer to the object returned from the 2139980SDana.Myers@Sun.COM * evaluation of a method or object 2149980SDana.Myers@Sun.COM * 2159980SDana.Myers@Sun.COM * RETURN: Status 2169980SDana.Myers@Sun.COM * 2179980SDana.Myers@Sun.COM * DESCRIPTION: Check an ACPI name for a match in the predefined name list. 2189980SDana.Myers@Sun.COM * 2199980SDana.Myers@Sun.COM ******************************************************************************/ 2209980SDana.Myers@Sun.COM 2219980SDana.Myers@Sun.COM ACPI_STATUS 2229980SDana.Myers@Sun.COM AcpiNsCheckPredefinedNames ( 2239980SDana.Myers@Sun.COM ACPI_NAMESPACE_NODE *Node, 2249980SDana.Myers@Sun.COM UINT32 UserParamCount, 2259980SDana.Myers@Sun.COM ACPI_STATUS ReturnStatus, 2269980SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ReturnObjectPtr) 2279980SDana.Myers@Sun.COM { 2289980SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; 2299980SDana.Myers@Sun.COM ACPI_STATUS Status = AE_OK; 2309980SDana.Myers@Sun.COM const ACPI_PREDEFINED_INFO *Predefined; 2319980SDana.Myers@Sun.COM char *Pathname; 232*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data; 2339980SDana.Myers@Sun.COM 2349980SDana.Myers@Sun.COM 2359980SDana.Myers@Sun.COM /* Match the name for this method/object against the predefined list */ 2369980SDana.Myers@Sun.COM 2379980SDana.Myers@Sun.COM Predefined = AcpiNsCheckForPredefinedName (Node); 2389980SDana.Myers@Sun.COM 239*11225SDana.Myers@Sun.COM /* Get the full pathname to the object, for use in warning messages */ 2409980SDana.Myers@Sun.COM 2419980SDana.Myers@Sun.COM Pathname = AcpiNsGetExternalPathname (Node); 2429980SDana.Myers@Sun.COM if (!Pathname) 2439980SDana.Myers@Sun.COM { 2449980SDana.Myers@Sun.COM return (AE_OK); /* Could not get pathname, ignore */ 2459980SDana.Myers@Sun.COM } 2469980SDana.Myers@Sun.COM 2479980SDana.Myers@Sun.COM /* 2489980SDana.Myers@Sun.COM * Check that the parameter count for this method matches the ASL 2499980SDana.Myers@Sun.COM * definition. For predefined names, ensure that both the caller and 2509980SDana.Myers@Sun.COM * the method itself are in accordance with the ACPI specification. 2519980SDana.Myers@Sun.COM */ 2529980SDana.Myers@Sun.COM AcpiNsCheckParameterCount (Pathname, Node, UserParamCount, Predefined); 2539980SDana.Myers@Sun.COM 2549980SDana.Myers@Sun.COM /* If not a predefined name, we cannot validate the return object */ 2559980SDana.Myers@Sun.COM 2569980SDana.Myers@Sun.COM if (!Predefined) 2579980SDana.Myers@Sun.COM { 258*11225SDana.Myers@Sun.COM goto Cleanup; 2599980SDana.Myers@Sun.COM } 2609980SDana.Myers@Sun.COM 2619980SDana.Myers@Sun.COM /* 262*11225SDana.Myers@Sun.COM * If the method failed or did not actually return an object, we cannot 263*11225SDana.Myers@Sun.COM * validate the return object 2649980SDana.Myers@Sun.COM */ 265*11225SDana.Myers@Sun.COM if ((ReturnStatus != AE_OK) && (ReturnStatus != AE_CTRL_RETURN_VALUE)) 2669980SDana.Myers@Sun.COM { 267*11225SDana.Myers@Sun.COM goto Cleanup; 2689980SDana.Myers@Sun.COM } 2699980SDana.Myers@Sun.COM 2709980SDana.Myers@Sun.COM /* 2719980SDana.Myers@Sun.COM * If there is no return value, check if we require a return value for 2729980SDana.Myers@Sun.COM * this predefined name. Either one return value is expected, or none, 2739980SDana.Myers@Sun.COM * for both methods and other objects. 2749980SDana.Myers@Sun.COM * 2759980SDana.Myers@Sun.COM * Exit now if there is no return object. Warning if one was expected. 2769980SDana.Myers@Sun.COM */ 2779980SDana.Myers@Sun.COM if (!ReturnObject) 2789980SDana.Myers@Sun.COM { 2799980SDana.Myers@Sun.COM if ((Predefined->Info.ExpectedBtypes) && 2809980SDana.Myers@Sun.COM (!(Predefined->Info.ExpectedBtypes & ACPI_RTYPE_NONE))) 2819980SDana.Myers@Sun.COM { 282*11225SDana.Myers@Sun.COM ACPI_WARN_PREDEFINED ((AE_INFO, Pathname, ACPI_WARN_ALWAYS, 283*11225SDana.Myers@Sun.COM "Missing expected return value")); 2849980SDana.Myers@Sun.COM 2859980SDana.Myers@Sun.COM Status = AE_AML_NO_RETURN_VALUE; 2869980SDana.Myers@Sun.COM } 287*11225SDana.Myers@Sun.COM goto Cleanup; 2889980SDana.Myers@Sun.COM } 2899980SDana.Myers@Sun.COM 2909980SDana.Myers@Sun.COM /* 291*11225SDana.Myers@Sun.COM * 1) We have a return value, but if one wasn't expected, just exit, this is 292*11225SDana.Myers@Sun.COM * not a problem. For example, if the "Implicit Return" feature is 293*11225SDana.Myers@Sun.COM * enabled, methods will always return a value. 2949980SDana.Myers@Sun.COM * 295*11225SDana.Myers@Sun.COM * 2) If the return value can be of any type, then we cannot perform any 296*11225SDana.Myers@Sun.COM * validation, exit. 2979980SDana.Myers@Sun.COM */ 298*11225SDana.Myers@Sun.COM if ((!Predefined->Info.ExpectedBtypes) || 299*11225SDana.Myers@Sun.COM (Predefined->Info.ExpectedBtypes == ACPI_RTYPE_ALL)) 3009980SDana.Myers@Sun.COM { 301*11225SDana.Myers@Sun.COM goto Cleanup; 3029980SDana.Myers@Sun.COM } 3039980SDana.Myers@Sun.COM 304*11225SDana.Myers@Sun.COM /* Create the parameter data block for object validation */ 305*11225SDana.Myers@Sun.COM 306*11225SDana.Myers@Sun.COM Data = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_PREDEFINED_DATA)); 307*11225SDana.Myers@Sun.COM if (!Data) 308*11225SDana.Myers@Sun.COM { 309*11225SDana.Myers@Sun.COM goto Cleanup; 310*11225SDana.Myers@Sun.COM } 311*11225SDana.Myers@Sun.COM Data->Predefined = Predefined; 312*11225SDana.Myers@Sun.COM Data->NodeFlags = Node->Flags; 313*11225SDana.Myers@Sun.COM Data->Pathname = Pathname; 314*11225SDana.Myers@Sun.COM 3159980SDana.Myers@Sun.COM /* 3169980SDana.Myers@Sun.COM * Check that the type of the return object is what is expected for 3179980SDana.Myers@Sun.COM * this predefined name 3189980SDana.Myers@Sun.COM */ 319*11225SDana.Myers@Sun.COM Status = AcpiNsCheckObjectType (Data, ReturnObjectPtr, 320*11225SDana.Myers@Sun.COM Predefined->Info.ExpectedBtypes, ACPI_NOT_PACKAGE_ELEMENT); 3219980SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 3229980SDana.Myers@Sun.COM { 323*11225SDana.Myers@Sun.COM goto CheckValidationStatus; 3249980SDana.Myers@Sun.COM } 3259980SDana.Myers@Sun.COM 3269980SDana.Myers@Sun.COM /* For returned Package objects, check the type of all sub-objects */ 3279980SDana.Myers@Sun.COM 3289980SDana.Myers@Sun.COM if (ReturnObject->Common.Type == ACPI_TYPE_PACKAGE) 3299980SDana.Myers@Sun.COM { 330*11225SDana.Myers@Sun.COM Status = AcpiNsCheckPackage (Data, ReturnObjectPtr); 3319980SDana.Myers@Sun.COM } 3329980SDana.Myers@Sun.COM 333*11225SDana.Myers@Sun.COM /* 334*11225SDana.Myers@Sun.COM * Perform additional, more complicated repairs on a per-name 335*11225SDana.Myers@Sun.COM * basis. 336*11225SDana.Myers@Sun.COM */ 337*11225SDana.Myers@Sun.COM Status = AcpiNsComplexRepairs (Data, Node, Status, ReturnObjectPtr); 338*11225SDana.Myers@Sun.COM 339*11225SDana.Myers@Sun.COM 340*11225SDana.Myers@Sun.COM CheckValidationStatus: 341*11225SDana.Myers@Sun.COM /* 342*11225SDana.Myers@Sun.COM * If the object validation failed or if we successfully repaired one 343*11225SDana.Myers@Sun.COM * or more objects, mark the parent node to suppress further warning 344*11225SDana.Myers@Sun.COM * messages during the next evaluation of the same method/object. 345*11225SDana.Myers@Sun.COM */ 346*11225SDana.Myers@Sun.COM if (ACPI_FAILURE (Status) || (Data->Flags & ACPI_OBJECT_REPAIRED)) 347*11225SDana.Myers@Sun.COM { 348*11225SDana.Myers@Sun.COM Node->Flags |= ANOBJ_EVALUATED; 349*11225SDana.Myers@Sun.COM } 350*11225SDana.Myers@Sun.COM ACPI_FREE (Data); 351*11225SDana.Myers@Sun.COM 352*11225SDana.Myers@Sun.COM 353*11225SDana.Myers@Sun.COM Cleanup: 3549980SDana.Myers@Sun.COM ACPI_FREE (Pathname); 3559980SDana.Myers@Sun.COM return (Status); 3569980SDana.Myers@Sun.COM } 3579980SDana.Myers@Sun.COM 3589980SDana.Myers@Sun.COM 3599980SDana.Myers@Sun.COM /******************************************************************************* 3609980SDana.Myers@Sun.COM * 3619980SDana.Myers@Sun.COM * FUNCTION: AcpiNsCheckParameterCount 3629980SDana.Myers@Sun.COM * 3639980SDana.Myers@Sun.COM * PARAMETERS: Pathname - Full pathname to the node (for error msgs) 3649980SDana.Myers@Sun.COM * Node - Namespace node for the method/object 3659980SDana.Myers@Sun.COM * UserParamCount - Number of args passed in by the caller 3669980SDana.Myers@Sun.COM * Predefined - Pointer to entry in predefined name table 3679980SDana.Myers@Sun.COM * 3689980SDana.Myers@Sun.COM * RETURN: None 3699980SDana.Myers@Sun.COM * 3709980SDana.Myers@Sun.COM * DESCRIPTION: Check that the declared (in ASL/AML) parameter count for a 3719980SDana.Myers@Sun.COM * predefined name is what is expected (i.e., what is defined in 3729980SDana.Myers@Sun.COM * the ACPI specification for this predefined name.) 3739980SDana.Myers@Sun.COM * 3749980SDana.Myers@Sun.COM ******************************************************************************/ 3759980SDana.Myers@Sun.COM 3769980SDana.Myers@Sun.COM void 3779980SDana.Myers@Sun.COM AcpiNsCheckParameterCount ( 3789980SDana.Myers@Sun.COM char *Pathname, 3799980SDana.Myers@Sun.COM ACPI_NAMESPACE_NODE *Node, 3809980SDana.Myers@Sun.COM UINT32 UserParamCount, 3819980SDana.Myers@Sun.COM const ACPI_PREDEFINED_INFO *Predefined) 3829980SDana.Myers@Sun.COM { 3839980SDana.Myers@Sun.COM UINT32 ParamCount; 3849980SDana.Myers@Sun.COM UINT32 RequiredParamsCurrent; 3859980SDana.Myers@Sun.COM UINT32 RequiredParamsOld; 3869980SDana.Myers@Sun.COM 3879980SDana.Myers@Sun.COM 3889980SDana.Myers@Sun.COM /* Methods have 0-7 parameters. All other types have zero. */ 3899980SDana.Myers@Sun.COM 3909980SDana.Myers@Sun.COM ParamCount = 0; 3919980SDana.Myers@Sun.COM if (Node->Type == ACPI_TYPE_METHOD) 3929980SDana.Myers@Sun.COM { 3939980SDana.Myers@Sun.COM ParamCount = Node->Object->Method.ParamCount; 3949980SDana.Myers@Sun.COM } 3959980SDana.Myers@Sun.COM 3969980SDana.Myers@Sun.COM if (!Predefined) 3979980SDana.Myers@Sun.COM { 3989980SDana.Myers@Sun.COM /* 399*11225SDana.Myers@Sun.COM * Check the parameter count for non-predefined methods/objects. 400*11225SDana.Myers@Sun.COM * 4019980SDana.Myers@Sun.COM * Warning if too few or too many arguments have been passed by the 4029980SDana.Myers@Sun.COM * caller. An incorrect number of arguments may not cause the method 4039980SDana.Myers@Sun.COM * to fail. However, the method will fail if there are too few 4049980SDana.Myers@Sun.COM * arguments and the method attempts to use one of the missing ones. 4059980SDana.Myers@Sun.COM */ 4069980SDana.Myers@Sun.COM if (UserParamCount < ParamCount) 4079980SDana.Myers@Sun.COM { 408*11225SDana.Myers@Sun.COM ACPI_WARN_PREDEFINED ((AE_INFO, Pathname, ACPI_WARN_ALWAYS, 409*11225SDana.Myers@Sun.COM "Insufficient arguments - needs %u, found %u", 410*11225SDana.Myers@Sun.COM ParamCount, UserParamCount)); 4119980SDana.Myers@Sun.COM } 4129980SDana.Myers@Sun.COM else if (UserParamCount > ParamCount) 4139980SDana.Myers@Sun.COM { 414*11225SDana.Myers@Sun.COM ACPI_WARN_PREDEFINED ((AE_INFO, Pathname, ACPI_WARN_ALWAYS, 415*11225SDana.Myers@Sun.COM "Excess arguments - needs %u, found %u", 416*11225SDana.Myers@Sun.COM ParamCount, UserParamCount)); 4179980SDana.Myers@Sun.COM } 4189980SDana.Myers@Sun.COM return; 4199980SDana.Myers@Sun.COM } 4209980SDana.Myers@Sun.COM 421*11225SDana.Myers@Sun.COM /* 422*11225SDana.Myers@Sun.COM * Validate the user-supplied parameter count. 423*11225SDana.Myers@Sun.COM * Allow two different legal argument counts (_SCP, etc.) 424*11225SDana.Myers@Sun.COM */ 4259980SDana.Myers@Sun.COM RequiredParamsCurrent = Predefined->Info.ParamCount & 0x0F; 4269980SDana.Myers@Sun.COM RequiredParamsOld = Predefined->Info.ParamCount >> 4; 4279980SDana.Myers@Sun.COM 4289980SDana.Myers@Sun.COM if (UserParamCount != ACPI_UINT32_MAX) 4299980SDana.Myers@Sun.COM { 4309980SDana.Myers@Sun.COM if ((UserParamCount != RequiredParamsCurrent) && 4319980SDana.Myers@Sun.COM (UserParamCount != RequiredParamsOld)) 4329980SDana.Myers@Sun.COM { 433*11225SDana.Myers@Sun.COM ACPI_WARN_PREDEFINED ((AE_INFO, Pathname, ACPI_WARN_ALWAYS, 434*11225SDana.Myers@Sun.COM "Parameter count mismatch - " 435*11225SDana.Myers@Sun.COM "caller passed %u, ACPI requires %u", 436*11225SDana.Myers@Sun.COM UserParamCount, RequiredParamsCurrent)); 4379980SDana.Myers@Sun.COM } 4389980SDana.Myers@Sun.COM } 4399980SDana.Myers@Sun.COM 4409980SDana.Myers@Sun.COM /* 4419980SDana.Myers@Sun.COM * Check that the ASL-defined parameter count is what is expected for 442*11225SDana.Myers@Sun.COM * this predefined name (parameter count as defined by the ACPI 443*11225SDana.Myers@Sun.COM * specification) 4449980SDana.Myers@Sun.COM */ 4459980SDana.Myers@Sun.COM if ((ParamCount != RequiredParamsCurrent) && 4469980SDana.Myers@Sun.COM (ParamCount != RequiredParamsOld)) 4479980SDana.Myers@Sun.COM { 448*11225SDana.Myers@Sun.COM ACPI_WARN_PREDEFINED ((AE_INFO, Pathname, Node->Flags, 449*11225SDana.Myers@Sun.COM "Parameter count mismatch - ASL declared %u, ACPI requires %u", 450*11225SDana.Myers@Sun.COM ParamCount, RequiredParamsCurrent)); 4519980SDana.Myers@Sun.COM } 4529980SDana.Myers@Sun.COM } 4539980SDana.Myers@Sun.COM 4549980SDana.Myers@Sun.COM 4559980SDana.Myers@Sun.COM /******************************************************************************* 4569980SDana.Myers@Sun.COM * 4579980SDana.Myers@Sun.COM * FUNCTION: AcpiNsCheckForPredefinedName 4589980SDana.Myers@Sun.COM * 4599980SDana.Myers@Sun.COM * PARAMETERS: Node - Namespace node for the method/object 4609980SDana.Myers@Sun.COM * 4619980SDana.Myers@Sun.COM * RETURN: Pointer to entry in predefined table. NULL indicates not found. 4629980SDana.Myers@Sun.COM * 4639980SDana.Myers@Sun.COM * DESCRIPTION: Check an object name against the predefined object list. 4649980SDana.Myers@Sun.COM * 4659980SDana.Myers@Sun.COM ******************************************************************************/ 4669980SDana.Myers@Sun.COM 4679980SDana.Myers@Sun.COM const ACPI_PREDEFINED_INFO * 4689980SDana.Myers@Sun.COM AcpiNsCheckForPredefinedName ( 4699980SDana.Myers@Sun.COM ACPI_NAMESPACE_NODE *Node) 4709980SDana.Myers@Sun.COM { 4719980SDana.Myers@Sun.COM const ACPI_PREDEFINED_INFO *ThisName; 4729980SDana.Myers@Sun.COM 4739980SDana.Myers@Sun.COM 4749980SDana.Myers@Sun.COM /* Quick check for a predefined name, first character must be underscore */ 4759980SDana.Myers@Sun.COM 4769980SDana.Myers@Sun.COM if (Node->Name.Ascii[0] != '_') 4779980SDana.Myers@Sun.COM { 4789980SDana.Myers@Sun.COM return (NULL); 4799980SDana.Myers@Sun.COM } 4809980SDana.Myers@Sun.COM 4819980SDana.Myers@Sun.COM /* Search info table for a predefined method/object name */ 4829980SDana.Myers@Sun.COM 4839980SDana.Myers@Sun.COM ThisName = PredefinedNames; 4849980SDana.Myers@Sun.COM while (ThisName->Info.Name[0]) 4859980SDana.Myers@Sun.COM { 4869980SDana.Myers@Sun.COM if (ACPI_COMPARE_NAME (Node->Name.Ascii, ThisName->Info.Name)) 4879980SDana.Myers@Sun.COM { 4889980SDana.Myers@Sun.COM return (ThisName); 4899980SDana.Myers@Sun.COM } 4909980SDana.Myers@Sun.COM 4919980SDana.Myers@Sun.COM /* 4929980SDana.Myers@Sun.COM * Skip next entry in the table if this name returns a Package 4939980SDana.Myers@Sun.COM * (next entry contains the package info) 4949980SDana.Myers@Sun.COM */ 4959980SDana.Myers@Sun.COM if (ThisName->Info.ExpectedBtypes & ACPI_RTYPE_PACKAGE) 4969980SDana.Myers@Sun.COM { 4979980SDana.Myers@Sun.COM ThisName++; 4989980SDana.Myers@Sun.COM } 4999980SDana.Myers@Sun.COM 5009980SDana.Myers@Sun.COM ThisName++; 5019980SDana.Myers@Sun.COM } 5029980SDana.Myers@Sun.COM 503*11225SDana.Myers@Sun.COM return (NULL); /* Not found */ 5049980SDana.Myers@Sun.COM } 5059980SDana.Myers@Sun.COM 5069980SDana.Myers@Sun.COM 5079980SDana.Myers@Sun.COM /******************************************************************************* 5089980SDana.Myers@Sun.COM * 5099980SDana.Myers@Sun.COM * FUNCTION: AcpiNsCheckPackage 5109980SDana.Myers@Sun.COM * 511*11225SDana.Myers@Sun.COM * PARAMETERS: Data - Pointer to validation data structure 5129980SDana.Myers@Sun.COM * ReturnObjectPtr - Pointer to the object returned from the 5139980SDana.Myers@Sun.COM * evaluation of a method or object 5149980SDana.Myers@Sun.COM * 5159980SDana.Myers@Sun.COM * RETURN: Status 5169980SDana.Myers@Sun.COM * 5179980SDana.Myers@Sun.COM * DESCRIPTION: Check a returned package object for the correct count and 5189980SDana.Myers@Sun.COM * correct type of all sub-objects. 5199980SDana.Myers@Sun.COM * 5209980SDana.Myers@Sun.COM ******************************************************************************/ 5219980SDana.Myers@Sun.COM 5229980SDana.Myers@Sun.COM static ACPI_STATUS 5239980SDana.Myers@Sun.COM AcpiNsCheckPackage ( 524*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data, 525*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ReturnObjectPtr) 5269980SDana.Myers@Sun.COM { 5279980SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; 5289980SDana.Myers@Sun.COM const ACPI_PREDEFINED_INFO *Package; 5299980SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **Elements; 530*11225SDana.Myers@Sun.COM ACPI_STATUS Status = AE_OK; 5319980SDana.Myers@Sun.COM UINT32 ExpectedCount; 5329980SDana.Myers@Sun.COM UINT32 Count; 5339980SDana.Myers@Sun.COM UINT32 i; 5349980SDana.Myers@Sun.COM 5359980SDana.Myers@Sun.COM 5369980SDana.Myers@Sun.COM ACPI_FUNCTION_NAME (NsCheckPackage); 5379980SDana.Myers@Sun.COM 5389980SDana.Myers@Sun.COM 5399980SDana.Myers@Sun.COM /* The package info for this name is in the next table entry */ 5409980SDana.Myers@Sun.COM 541*11225SDana.Myers@Sun.COM Package = Data->Predefined + 1; 5429980SDana.Myers@Sun.COM 5439980SDana.Myers@Sun.COM ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, 5449980SDana.Myers@Sun.COM "%s Validating return Package of Type %X, Count %X\n", 545*11225SDana.Myers@Sun.COM Data->Pathname, Package->RetInfo.Type, ReturnObject->Package.Count)); 5469980SDana.Myers@Sun.COM 5479980SDana.Myers@Sun.COM /* Extract package count and elements array */ 5489980SDana.Myers@Sun.COM 5499980SDana.Myers@Sun.COM Elements = ReturnObject->Package.Elements; 5509980SDana.Myers@Sun.COM Count = ReturnObject->Package.Count; 5519980SDana.Myers@Sun.COM 5529980SDana.Myers@Sun.COM /* The package must have at least one element, else invalid */ 5539980SDana.Myers@Sun.COM 5549980SDana.Myers@Sun.COM if (!Count) 5559980SDana.Myers@Sun.COM { 556*11225SDana.Myers@Sun.COM ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, 557*11225SDana.Myers@Sun.COM "Return Package has no elements (empty)")); 5589980SDana.Myers@Sun.COM 5599980SDana.Myers@Sun.COM return (AE_AML_OPERAND_VALUE); 5609980SDana.Myers@Sun.COM } 5619980SDana.Myers@Sun.COM 5629980SDana.Myers@Sun.COM /* 5639980SDana.Myers@Sun.COM * Decode the type of the expected package contents 5649980SDana.Myers@Sun.COM * 5659980SDana.Myers@Sun.COM * PTYPE1 packages contain no subpackages 5669980SDana.Myers@Sun.COM * PTYPE2 packages contain sub-packages 5679980SDana.Myers@Sun.COM */ 5689980SDana.Myers@Sun.COM switch (Package->RetInfo.Type) 5699980SDana.Myers@Sun.COM { 5709980SDana.Myers@Sun.COM case ACPI_PTYPE1_FIXED: 5719980SDana.Myers@Sun.COM 5729980SDana.Myers@Sun.COM /* 5739980SDana.Myers@Sun.COM * The package count is fixed and there are no sub-packages 5749980SDana.Myers@Sun.COM * 5759980SDana.Myers@Sun.COM * If package is too small, exit. 5769980SDana.Myers@Sun.COM * If package is larger than expected, issue warning but continue 5779980SDana.Myers@Sun.COM */ 5789980SDana.Myers@Sun.COM ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2; 5799980SDana.Myers@Sun.COM if (Count < ExpectedCount) 5809980SDana.Myers@Sun.COM { 5819980SDana.Myers@Sun.COM goto PackageTooSmall; 5829980SDana.Myers@Sun.COM } 5839980SDana.Myers@Sun.COM else if (Count > ExpectedCount) 5849980SDana.Myers@Sun.COM { 585*11225SDana.Myers@Sun.COM ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, 586*11225SDana.Myers@Sun.COM "Return Package is larger than needed - " 587*11225SDana.Myers@Sun.COM "found %u, expected %u", Count, ExpectedCount)); 5889980SDana.Myers@Sun.COM } 5899980SDana.Myers@Sun.COM 5909980SDana.Myers@Sun.COM /* Validate all elements of the returned package */ 5919980SDana.Myers@Sun.COM 592*11225SDana.Myers@Sun.COM Status = AcpiNsCheckPackageElements (Data, Elements, 5939980SDana.Myers@Sun.COM Package->RetInfo.ObjectType1, Package->RetInfo.Count1, 5949980SDana.Myers@Sun.COM Package->RetInfo.ObjectType2, Package->RetInfo.Count2, 0); 5959980SDana.Myers@Sun.COM break; 5969980SDana.Myers@Sun.COM 5979980SDana.Myers@Sun.COM 5989980SDana.Myers@Sun.COM case ACPI_PTYPE1_VAR: 5999980SDana.Myers@Sun.COM 6009980SDana.Myers@Sun.COM /* 6019980SDana.Myers@Sun.COM * The package count is variable, there are no sub-packages, and all 6029980SDana.Myers@Sun.COM * elements must be of the same type 6039980SDana.Myers@Sun.COM */ 6049980SDana.Myers@Sun.COM for (i = 0; i < Count; i++) 6059980SDana.Myers@Sun.COM { 606*11225SDana.Myers@Sun.COM Status = AcpiNsCheckObjectType (Data, Elements, 6079980SDana.Myers@Sun.COM Package->RetInfo.ObjectType1, i); 6089980SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 6099980SDana.Myers@Sun.COM { 6109980SDana.Myers@Sun.COM return (Status); 6119980SDana.Myers@Sun.COM } 6129980SDana.Myers@Sun.COM Elements++; 6139980SDana.Myers@Sun.COM } 6149980SDana.Myers@Sun.COM break; 6159980SDana.Myers@Sun.COM 6169980SDana.Myers@Sun.COM 6179980SDana.Myers@Sun.COM case ACPI_PTYPE1_OPTION: 6189980SDana.Myers@Sun.COM 6199980SDana.Myers@Sun.COM /* 6209980SDana.Myers@Sun.COM * The package count is variable, there are no sub-packages. There are 6219980SDana.Myers@Sun.COM * a fixed number of required elements, and a variable number of 6229980SDana.Myers@Sun.COM * optional elements. 6239980SDana.Myers@Sun.COM * 6249980SDana.Myers@Sun.COM * Check if package is at least as large as the minimum required 6259980SDana.Myers@Sun.COM */ 6269980SDana.Myers@Sun.COM ExpectedCount = Package->RetInfo3.Count; 6279980SDana.Myers@Sun.COM if (Count < ExpectedCount) 6289980SDana.Myers@Sun.COM { 6299980SDana.Myers@Sun.COM goto PackageTooSmall; 6309980SDana.Myers@Sun.COM } 6319980SDana.Myers@Sun.COM 6329980SDana.Myers@Sun.COM /* Variable number of sub-objects */ 6339980SDana.Myers@Sun.COM 6349980SDana.Myers@Sun.COM for (i = 0; i < Count; i++) 6359980SDana.Myers@Sun.COM { 6369980SDana.Myers@Sun.COM if (i < Package->RetInfo3.Count) 6379980SDana.Myers@Sun.COM { 6389980SDana.Myers@Sun.COM /* These are the required package elements (0, 1, or 2) */ 6399980SDana.Myers@Sun.COM 640*11225SDana.Myers@Sun.COM Status = AcpiNsCheckObjectType (Data, Elements, 6419980SDana.Myers@Sun.COM Package->RetInfo3.ObjectType[i], i); 6429980SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 6439980SDana.Myers@Sun.COM { 6449980SDana.Myers@Sun.COM return (Status); 6459980SDana.Myers@Sun.COM } 6469980SDana.Myers@Sun.COM } 6479980SDana.Myers@Sun.COM else 6489980SDana.Myers@Sun.COM { 6499980SDana.Myers@Sun.COM /* These are the optional package elements */ 6509980SDana.Myers@Sun.COM 651*11225SDana.Myers@Sun.COM Status = AcpiNsCheckObjectType (Data, Elements, 6529980SDana.Myers@Sun.COM Package->RetInfo3.TailObjectType, i); 6539980SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 6549980SDana.Myers@Sun.COM { 6559980SDana.Myers@Sun.COM return (Status); 6569980SDana.Myers@Sun.COM } 6579980SDana.Myers@Sun.COM } 6589980SDana.Myers@Sun.COM Elements++; 6599980SDana.Myers@Sun.COM } 6609980SDana.Myers@Sun.COM break; 6619980SDana.Myers@Sun.COM 6629980SDana.Myers@Sun.COM 663*11225SDana.Myers@Sun.COM case ACPI_PTYPE2_REV_FIXED: 664*11225SDana.Myers@Sun.COM 665*11225SDana.Myers@Sun.COM /* First element is the (Integer) revision */ 666*11225SDana.Myers@Sun.COM 667*11225SDana.Myers@Sun.COM Status = AcpiNsCheckObjectType (Data, Elements, 668*11225SDana.Myers@Sun.COM ACPI_RTYPE_INTEGER, 0); 669*11225SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 670*11225SDana.Myers@Sun.COM { 671*11225SDana.Myers@Sun.COM return (Status); 672*11225SDana.Myers@Sun.COM } 673*11225SDana.Myers@Sun.COM 674*11225SDana.Myers@Sun.COM Elements++; 675*11225SDana.Myers@Sun.COM Count--; 676*11225SDana.Myers@Sun.COM 677*11225SDana.Myers@Sun.COM /* Examine the sub-packages */ 678*11225SDana.Myers@Sun.COM 679*11225SDana.Myers@Sun.COM Status = AcpiNsCheckPackageList (Data, Package, Elements, Count); 680*11225SDana.Myers@Sun.COM break; 681*11225SDana.Myers@Sun.COM 682*11225SDana.Myers@Sun.COM 6839980SDana.Myers@Sun.COM case ACPI_PTYPE2_PKG_COUNT: 6849980SDana.Myers@Sun.COM 6859980SDana.Myers@Sun.COM /* First element is the (Integer) count of sub-packages to follow */ 6869980SDana.Myers@Sun.COM 687*11225SDana.Myers@Sun.COM Status = AcpiNsCheckObjectType (Data, Elements, 6889980SDana.Myers@Sun.COM ACPI_RTYPE_INTEGER, 0); 6899980SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 6909980SDana.Myers@Sun.COM { 6919980SDana.Myers@Sun.COM return (Status); 6929980SDana.Myers@Sun.COM } 6939980SDana.Myers@Sun.COM 6949980SDana.Myers@Sun.COM /* 6959980SDana.Myers@Sun.COM * Count cannot be larger than the parent package length, but allow it 6969980SDana.Myers@Sun.COM * to be smaller. The >= accounts for the Integer above. 6979980SDana.Myers@Sun.COM */ 6989980SDana.Myers@Sun.COM ExpectedCount = (UINT32) (*Elements)->Integer.Value; 6999980SDana.Myers@Sun.COM if (ExpectedCount >= Count) 7009980SDana.Myers@Sun.COM { 7019980SDana.Myers@Sun.COM goto PackageTooSmall; 7029980SDana.Myers@Sun.COM } 7039980SDana.Myers@Sun.COM 7049980SDana.Myers@Sun.COM Count = ExpectedCount; 7059980SDana.Myers@Sun.COM Elements++; 7069980SDana.Myers@Sun.COM 707*11225SDana.Myers@Sun.COM /* Examine the sub-packages */ 7089980SDana.Myers@Sun.COM 709*11225SDana.Myers@Sun.COM Status = AcpiNsCheckPackageList (Data, Package, Elements, Count); 710*11225SDana.Myers@Sun.COM break; 7119980SDana.Myers@Sun.COM 7129980SDana.Myers@Sun.COM 7139980SDana.Myers@Sun.COM case ACPI_PTYPE2: 7149980SDana.Myers@Sun.COM case ACPI_PTYPE2_FIXED: 7159980SDana.Myers@Sun.COM case ACPI_PTYPE2_MIN: 7169980SDana.Myers@Sun.COM case ACPI_PTYPE2_COUNT: 7179980SDana.Myers@Sun.COM 7189980SDana.Myers@Sun.COM /* 719*11225SDana.Myers@Sun.COM * These types all return a single Package that consists of a 720*11225SDana.Myers@Sun.COM * variable number of sub-Packages. 721*11225SDana.Myers@Sun.COM * 722*11225SDana.Myers@Sun.COM * First, ensure that the first element is a sub-Package. If not, 723*11225SDana.Myers@Sun.COM * the BIOS may have incorrectly returned the object as a single 724*11225SDana.Myers@Sun.COM * package instead of a Package of Packages (a common error if 725*11225SDana.Myers@Sun.COM * there is only one entry). We may be able to repair this by 726*11225SDana.Myers@Sun.COM * wrapping the returned Package with a new outer Package. 7279980SDana.Myers@Sun.COM */ 728*11225SDana.Myers@Sun.COM if (*Elements && ((*Elements)->Common.Type != ACPI_TYPE_PACKAGE)) 7299980SDana.Myers@Sun.COM { 730*11225SDana.Myers@Sun.COM /* Create the new outer package and populate it */ 7319980SDana.Myers@Sun.COM 732*11225SDana.Myers@Sun.COM Status = AcpiNsRepairPackageList (Data, ReturnObjectPtr); 7339980SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 7349980SDana.Myers@Sun.COM { 7359980SDana.Myers@Sun.COM return (Status); 7369980SDana.Myers@Sun.COM } 7379980SDana.Myers@Sun.COM 738*11225SDana.Myers@Sun.COM /* Update locals to point to the new package (of 1 element) */ 7399980SDana.Myers@Sun.COM 740*11225SDana.Myers@Sun.COM ReturnObject = *ReturnObjectPtr; 741*11225SDana.Myers@Sun.COM Elements = ReturnObject->Package.Elements; 742*11225SDana.Myers@Sun.COM Count = 1; 743*11225SDana.Myers@Sun.COM } 7449980SDana.Myers@Sun.COM 745*11225SDana.Myers@Sun.COM /* Examine the sub-packages */ 7469980SDana.Myers@Sun.COM 747*11225SDana.Myers@Sun.COM Status = AcpiNsCheckPackageList (Data, Package, Elements, Count); 7489980SDana.Myers@Sun.COM break; 7499980SDana.Myers@Sun.COM 7509980SDana.Myers@Sun.COM 7519980SDana.Myers@Sun.COM default: 7529980SDana.Myers@Sun.COM 7539980SDana.Myers@Sun.COM /* Should not get here if predefined info table is correct */ 7549980SDana.Myers@Sun.COM 755*11225SDana.Myers@Sun.COM ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, 756*11225SDana.Myers@Sun.COM "Invalid internal return type in table entry: %X", 757*11225SDana.Myers@Sun.COM Package->RetInfo.Type)); 7589980SDana.Myers@Sun.COM 7599980SDana.Myers@Sun.COM return (AE_AML_INTERNAL); 7609980SDana.Myers@Sun.COM } 7619980SDana.Myers@Sun.COM 762*11225SDana.Myers@Sun.COM return (Status); 763*11225SDana.Myers@Sun.COM 764*11225SDana.Myers@Sun.COM 765*11225SDana.Myers@Sun.COM PackageTooSmall: 766*11225SDana.Myers@Sun.COM 767*11225SDana.Myers@Sun.COM /* Error exit for the case with an incorrect package count */ 768*11225SDana.Myers@Sun.COM 769*11225SDana.Myers@Sun.COM ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, 770*11225SDana.Myers@Sun.COM "Return Package is too small - found %u elements, expected %u", 771*11225SDana.Myers@Sun.COM Count, ExpectedCount)); 772*11225SDana.Myers@Sun.COM 773*11225SDana.Myers@Sun.COM return (AE_AML_OPERAND_VALUE); 774*11225SDana.Myers@Sun.COM } 775*11225SDana.Myers@Sun.COM 776*11225SDana.Myers@Sun.COM 777*11225SDana.Myers@Sun.COM /******************************************************************************* 778*11225SDana.Myers@Sun.COM * 779*11225SDana.Myers@Sun.COM * FUNCTION: AcpiNsCheckPackageList 780*11225SDana.Myers@Sun.COM * 781*11225SDana.Myers@Sun.COM * PARAMETERS: Data - Pointer to validation data structure 782*11225SDana.Myers@Sun.COM * Package - Pointer to package-specific info for method 783*11225SDana.Myers@Sun.COM * Elements - Element list of parent package. All elements 784*11225SDana.Myers@Sun.COM * of this list should be of type Package. 785*11225SDana.Myers@Sun.COM * Count - Count of subpackages 786*11225SDana.Myers@Sun.COM * 787*11225SDana.Myers@Sun.COM * RETURN: Status 788*11225SDana.Myers@Sun.COM * 789*11225SDana.Myers@Sun.COM * DESCRIPTION: Examine a list of subpackages 790*11225SDana.Myers@Sun.COM * 791*11225SDana.Myers@Sun.COM ******************************************************************************/ 792*11225SDana.Myers@Sun.COM 793*11225SDana.Myers@Sun.COM static ACPI_STATUS 794*11225SDana.Myers@Sun.COM AcpiNsCheckPackageList ( 795*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data, 796*11225SDana.Myers@Sun.COM const ACPI_PREDEFINED_INFO *Package, 797*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **Elements, 798*11225SDana.Myers@Sun.COM UINT32 Count) 799*11225SDana.Myers@Sun.COM { 800*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *SubPackage; 801*11225SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **SubElements; 802*11225SDana.Myers@Sun.COM ACPI_STATUS Status; 803*11225SDana.Myers@Sun.COM BOOLEAN NonTrailingNull = FALSE; 804*11225SDana.Myers@Sun.COM UINT32 ExpectedCount; 805*11225SDana.Myers@Sun.COM UINT32 i; 806*11225SDana.Myers@Sun.COM UINT32 j; 807*11225SDana.Myers@Sun.COM 808*11225SDana.Myers@Sun.COM 809*11225SDana.Myers@Sun.COM /* Validate each sub-Package in the parent Package */ 810*11225SDana.Myers@Sun.COM 811*11225SDana.Myers@Sun.COM for (i = 0; i < Count; i++) 812*11225SDana.Myers@Sun.COM { 813*11225SDana.Myers@Sun.COM /* 814*11225SDana.Myers@Sun.COM * Handling for NULL package elements. For now, we will simply allow 815*11225SDana.Myers@Sun.COM * a parent package with trailing NULL elements. This can happen if 816*11225SDana.Myers@Sun.COM * the package was defined to be longer than the initializer list. 817*11225SDana.Myers@Sun.COM * This is legal as per the ACPI specification. It is often used 818*11225SDana.Myers@Sun.COM * to allow for dynamic initialization of a Package. 819*11225SDana.Myers@Sun.COM * 820*11225SDana.Myers@Sun.COM * A future enhancement may be to simply truncate the package to 821*11225SDana.Myers@Sun.COM * remove the trailing NULL elements. 822*11225SDana.Myers@Sun.COM */ 823*11225SDana.Myers@Sun.COM if (!(*Elements)) 824*11225SDana.Myers@Sun.COM { 825*11225SDana.Myers@Sun.COM if (!NonTrailingNull) 826*11225SDana.Myers@Sun.COM { 827*11225SDana.Myers@Sun.COM /* Ensure the remaining elements are all NULL */ 828*11225SDana.Myers@Sun.COM 829*11225SDana.Myers@Sun.COM for (j = 1; j < (Count - i + 1); j++) 830*11225SDana.Myers@Sun.COM { 831*11225SDana.Myers@Sun.COM if (Elements[j]) 832*11225SDana.Myers@Sun.COM { 833*11225SDana.Myers@Sun.COM NonTrailingNull = TRUE; 834*11225SDana.Myers@Sun.COM } 835*11225SDana.Myers@Sun.COM } 836*11225SDana.Myers@Sun.COM 837*11225SDana.Myers@Sun.COM if (!NonTrailingNull) 838*11225SDana.Myers@Sun.COM { 839*11225SDana.Myers@Sun.COM /* Ignore the trailing NULL elements */ 840*11225SDana.Myers@Sun.COM 841*11225SDana.Myers@Sun.COM return (AE_OK); 842*11225SDana.Myers@Sun.COM } 843*11225SDana.Myers@Sun.COM } 844*11225SDana.Myers@Sun.COM 845*11225SDana.Myers@Sun.COM /* There are trailing non-null elements, issue warning */ 846*11225SDana.Myers@Sun.COM 847*11225SDana.Myers@Sun.COM ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, 848*11225SDana.Myers@Sun.COM "Found NULL element at package index %u", i)); 849*11225SDana.Myers@Sun.COM Elements++; 850*11225SDana.Myers@Sun.COM continue; 851*11225SDana.Myers@Sun.COM } 852*11225SDana.Myers@Sun.COM 853*11225SDana.Myers@Sun.COM SubPackage = *Elements; 854*11225SDana.Myers@Sun.COM SubElements = SubPackage->Package.Elements; 855*11225SDana.Myers@Sun.COM 856*11225SDana.Myers@Sun.COM /* Each sub-object must be of type Package */ 857*11225SDana.Myers@Sun.COM 858*11225SDana.Myers@Sun.COM Status = AcpiNsCheckObjectType (Data, &SubPackage, 859*11225SDana.Myers@Sun.COM ACPI_RTYPE_PACKAGE, i); 860*11225SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 861*11225SDana.Myers@Sun.COM { 862*11225SDana.Myers@Sun.COM return (Status); 863*11225SDana.Myers@Sun.COM } 864*11225SDana.Myers@Sun.COM 865*11225SDana.Myers@Sun.COM /* Examine the different types of expected sub-packages */ 866*11225SDana.Myers@Sun.COM 867*11225SDana.Myers@Sun.COM switch (Package->RetInfo.Type) 868*11225SDana.Myers@Sun.COM { 869*11225SDana.Myers@Sun.COM case ACPI_PTYPE2: 870*11225SDana.Myers@Sun.COM case ACPI_PTYPE2_PKG_COUNT: 871*11225SDana.Myers@Sun.COM case ACPI_PTYPE2_REV_FIXED: 872*11225SDana.Myers@Sun.COM 873*11225SDana.Myers@Sun.COM /* Each subpackage has a fixed number of elements */ 874*11225SDana.Myers@Sun.COM 875*11225SDana.Myers@Sun.COM ExpectedCount = Package->RetInfo.Count1 + Package->RetInfo.Count2; 876*11225SDana.Myers@Sun.COM if (SubPackage->Package.Count < ExpectedCount) 877*11225SDana.Myers@Sun.COM { 878*11225SDana.Myers@Sun.COM goto PackageTooSmall; 879*11225SDana.Myers@Sun.COM } 880*11225SDana.Myers@Sun.COM 881*11225SDana.Myers@Sun.COM Status = AcpiNsCheckPackageElements (Data, SubElements, 882*11225SDana.Myers@Sun.COM Package->RetInfo.ObjectType1, 883*11225SDana.Myers@Sun.COM Package->RetInfo.Count1, 884*11225SDana.Myers@Sun.COM Package->RetInfo.ObjectType2, 885*11225SDana.Myers@Sun.COM Package->RetInfo.Count2, 0); 886*11225SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 887*11225SDana.Myers@Sun.COM { 888*11225SDana.Myers@Sun.COM return (Status); 889*11225SDana.Myers@Sun.COM } 890*11225SDana.Myers@Sun.COM break; 891*11225SDana.Myers@Sun.COM 892*11225SDana.Myers@Sun.COM 893*11225SDana.Myers@Sun.COM case ACPI_PTYPE2_FIXED: 894*11225SDana.Myers@Sun.COM 895*11225SDana.Myers@Sun.COM /* Each sub-package has a fixed length */ 896*11225SDana.Myers@Sun.COM 897*11225SDana.Myers@Sun.COM ExpectedCount = Package->RetInfo2.Count; 898*11225SDana.Myers@Sun.COM if (SubPackage->Package.Count < ExpectedCount) 899*11225SDana.Myers@Sun.COM { 900*11225SDana.Myers@Sun.COM goto PackageTooSmall; 901*11225SDana.Myers@Sun.COM } 902*11225SDana.Myers@Sun.COM 903*11225SDana.Myers@Sun.COM /* Check the type of each sub-package element */ 904*11225SDana.Myers@Sun.COM 905*11225SDana.Myers@Sun.COM for (j = 0; j < ExpectedCount; j++) 906*11225SDana.Myers@Sun.COM { 907*11225SDana.Myers@Sun.COM Status = AcpiNsCheckObjectType (Data, &SubElements[j], 908*11225SDana.Myers@Sun.COM Package->RetInfo2.ObjectType[j], j); 909*11225SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 910*11225SDana.Myers@Sun.COM { 911*11225SDana.Myers@Sun.COM return (Status); 912*11225SDana.Myers@Sun.COM } 913*11225SDana.Myers@Sun.COM } 914*11225SDana.Myers@Sun.COM break; 915*11225SDana.Myers@Sun.COM 916*11225SDana.Myers@Sun.COM 917*11225SDana.Myers@Sun.COM case ACPI_PTYPE2_MIN: 918*11225SDana.Myers@Sun.COM 919*11225SDana.Myers@Sun.COM /* Each sub-package has a variable but minimum length */ 920*11225SDana.Myers@Sun.COM 921*11225SDana.Myers@Sun.COM ExpectedCount = Package->RetInfo.Count1; 922*11225SDana.Myers@Sun.COM if (SubPackage->Package.Count < ExpectedCount) 923*11225SDana.Myers@Sun.COM { 924*11225SDana.Myers@Sun.COM goto PackageTooSmall; 925*11225SDana.Myers@Sun.COM } 926*11225SDana.Myers@Sun.COM 927*11225SDana.Myers@Sun.COM /* Check the type of each sub-package element */ 928*11225SDana.Myers@Sun.COM 929*11225SDana.Myers@Sun.COM Status = AcpiNsCheckPackageElements (Data, SubElements, 930*11225SDana.Myers@Sun.COM Package->RetInfo.ObjectType1, 931*11225SDana.Myers@Sun.COM SubPackage->Package.Count, 0, 0, 0); 932*11225SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 933*11225SDana.Myers@Sun.COM { 934*11225SDana.Myers@Sun.COM return (Status); 935*11225SDana.Myers@Sun.COM } 936*11225SDana.Myers@Sun.COM break; 937*11225SDana.Myers@Sun.COM 938*11225SDana.Myers@Sun.COM 939*11225SDana.Myers@Sun.COM case ACPI_PTYPE2_COUNT: 940*11225SDana.Myers@Sun.COM 941*11225SDana.Myers@Sun.COM /* 942*11225SDana.Myers@Sun.COM * First element is the (Integer) count of elements, including 943*11225SDana.Myers@Sun.COM * the count field. 944*11225SDana.Myers@Sun.COM */ 945*11225SDana.Myers@Sun.COM Status = AcpiNsCheckObjectType (Data, SubElements, 946*11225SDana.Myers@Sun.COM ACPI_RTYPE_INTEGER, 0); 947*11225SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 948*11225SDana.Myers@Sun.COM { 949*11225SDana.Myers@Sun.COM return (Status); 950*11225SDana.Myers@Sun.COM } 951*11225SDana.Myers@Sun.COM 952*11225SDana.Myers@Sun.COM /* 953*11225SDana.Myers@Sun.COM * Make sure package is large enough for the Count and is 954*11225SDana.Myers@Sun.COM * is as large as the minimum size 955*11225SDana.Myers@Sun.COM */ 956*11225SDana.Myers@Sun.COM ExpectedCount = (UINT32) (*SubElements)->Integer.Value; 957*11225SDana.Myers@Sun.COM if (SubPackage->Package.Count < ExpectedCount) 958*11225SDana.Myers@Sun.COM { 959*11225SDana.Myers@Sun.COM goto PackageTooSmall; 960*11225SDana.Myers@Sun.COM } 961*11225SDana.Myers@Sun.COM if (SubPackage->Package.Count < Package->RetInfo.Count1) 962*11225SDana.Myers@Sun.COM { 963*11225SDana.Myers@Sun.COM ExpectedCount = Package->RetInfo.Count1; 964*11225SDana.Myers@Sun.COM goto PackageTooSmall; 965*11225SDana.Myers@Sun.COM } 966*11225SDana.Myers@Sun.COM 967*11225SDana.Myers@Sun.COM /* Check the type of each sub-package element */ 968*11225SDana.Myers@Sun.COM 969*11225SDana.Myers@Sun.COM Status = AcpiNsCheckPackageElements (Data, (SubElements + 1), 970*11225SDana.Myers@Sun.COM Package->RetInfo.ObjectType1, 971*11225SDana.Myers@Sun.COM (ExpectedCount - 1), 0, 0, 1); 972*11225SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 973*11225SDana.Myers@Sun.COM { 974*11225SDana.Myers@Sun.COM return (Status); 975*11225SDana.Myers@Sun.COM } 976*11225SDana.Myers@Sun.COM break; 977*11225SDana.Myers@Sun.COM 978*11225SDana.Myers@Sun.COM 979*11225SDana.Myers@Sun.COM default: /* Should not get here, type was validated by caller */ 980*11225SDana.Myers@Sun.COM 981*11225SDana.Myers@Sun.COM return (AE_AML_INTERNAL); 982*11225SDana.Myers@Sun.COM } 983*11225SDana.Myers@Sun.COM 984*11225SDana.Myers@Sun.COM Elements++; 985*11225SDana.Myers@Sun.COM } 986*11225SDana.Myers@Sun.COM 9879980SDana.Myers@Sun.COM return (AE_OK); 9889980SDana.Myers@Sun.COM 9899980SDana.Myers@Sun.COM 9909980SDana.Myers@Sun.COM PackageTooSmall: 9919980SDana.Myers@Sun.COM 992*11225SDana.Myers@Sun.COM /* The sub-package count was smaller than required */ 9939980SDana.Myers@Sun.COM 994*11225SDana.Myers@Sun.COM ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, 995*11225SDana.Myers@Sun.COM "Return Sub-Package[%u] is too small - found %u elements, expected %u", 996*11225SDana.Myers@Sun.COM i, SubPackage->Package.Count, ExpectedCount)); 9979980SDana.Myers@Sun.COM 9989980SDana.Myers@Sun.COM return (AE_AML_OPERAND_VALUE); 9999980SDana.Myers@Sun.COM } 10009980SDana.Myers@Sun.COM 10019980SDana.Myers@Sun.COM 10029980SDana.Myers@Sun.COM /******************************************************************************* 10039980SDana.Myers@Sun.COM * 10049980SDana.Myers@Sun.COM * FUNCTION: AcpiNsCheckPackageElements 10059980SDana.Myers@Sun.COM * 1006*11225SDana.Myers@Sun.COM * PARAMETERS: Data - Pointer to validation data structure 10079980SDana.Myers@Sun.COM * Elements - Pointer to the package elements array 10089980SDana.Myers@Sun.COM * Type1 - Object type for first group 10099980SDana.Myers@Sun.COM * Count1 - Count for first group 10109980SDana.Myers@Sun.COM * Type2 - Object type for second group 10119980SDana.Myers@Sun.COM * Count2 - Count for second group 10129980SDana.Myers@Sun.COM * StartIndex - Start of the first group of elements 10139980SDana.Myers@Sun.COM * 10149980SDana.Myers@Sun.COM * RETURN: Status 10159980SDana.Myers@Sun.COM * 10169980SDana.Myers@Sun.COM * DESCRIPTION: Check that all elements of a package are of the correct object 10179980SDana.Myers@Sun.COM * type. Supports up to two groups of different object types. 10189980SDana.Myers@Sun.COM * 10199980SDana.Myers@Sun.COM ******************************************************************************/ 10209980SDana.Myers@Sun.COM 10219980SDana.Myers@Sun.COM static ACPI_STATUS 10229980SDana.Myers@Sun.COM AcpiNsCheckPackageElements ( 1023*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data, 10249980SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **Elements, 10259980SDana.Myers@Sun.COM UINT8 Type1, 10269980SDana.Myers@Sun.COM UINT32 Count1, 10279980SDana.Myers@Sun.COM UINT8 Type2, 10289980SDana.Myers@Sun.COM UINT32 Count2, 10299980SDana.Myers@Sun.COM UINT32 StartIndex) 10309980SDana.Myers@Sun.COM { 10319980SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ThisElement = Elements; 10329980SDana.Myers@Sun.COM ACPI_STATUS Status; 10339980SDana.Myers@Sun.COM UINT32 i; 10349980SDana.Myers@Sun.COM 10359980SDana.Myers@Sun.COM 10369980SDana.Myers@Sun.COM /* 10379980SDana.Myers@Sun.COM * Up to two groups of package elements are supported by the data 10389980SDana.Myers@Sun.COM * structure. All elements in each group must be of the same type. 10399980SDana.Myers@Sun.COM * The second group can have a count of zero. 10409980SDana.Myers@Sun.COM */ 10419980SDana.Myers@Sun.COM for (i = 0; i < Count1; i++) 10429980SDana.Myers@Sun.COM { 1043*11225SDana.Myers@Sun.COM Status = AcpiNsCheckObjectType (Data, ThisElement, 10449980SDana.Myers@Sun.COM Type1, i + StartIndex); 10459980SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 10469980SDana.Myers@Sun.COM { 10479980SDana.Myers@Sun.COM return (Status); 10489980SDana.Myers@Sun.COM } 10499980SDana.Myers@Sun.COM ThisElement++; 10509980SDana.Myers@Sun.COM } 10519980SDana.Myers@Sun.COM 10529980SDana.Myers@Sun.COM for (i = 0; i < Count2; i++) 10539980SDana.Myers@Sun.COM { 1054*11225SDana.Myers@Sun.COM Status = AcpiNsCheckObjectType (Data, ThisElement, 10559980SDana.Myers@Sun.COM Type2, (i + Count1 + StartIndex)); 10569980SDana.Myers@Sun.COM if (ACPI_FAILURE (Status)) 10579980SDana.Myers@Sun.COM { 10589980SDana.Myers@Sun.COM return (Status); 10599980SDana.Myers@Sun.COM } 10609980SDana.Myers@Sun.COM ThisElement++; 10619980SDana.Myers@Sun.COM } 10629980SDana.Myers@Sun.COM 10639980SDana.Myers@Sun.COM return (AE_OK); 10649980SDana.Myers@Sun.COM } 10659980SDana.Myers@Sun.COM 10669980SDana.Myers@Sun.COM 10679980SDana.Myers@Sun.COM /******************************************************************************* 10689980SDana.Myers@Sun.COM * 10699980SDana.Myers@Sun.COM * FUNCTION: AcpiNsCheckObjectType 10709980SDana.Myers@Sun.COM * 1071*11225SDana.Myers@Sun.COM * PARAMETERS: Data - Pointer to validation data structure 10729980SDana.Myers@Sun.COM * ReturnObjectPtr - Pointer to the object returned from the 10739980SDana.Myers@Sun.COM * evaluation of a method or object 10749980SDana.Myers@Sun.COM * ExpectedBtypes - Bitmap of expected return type(s) 10759980SDana.Myers@Sun.COM * PackageIndex - Index of object within parent package (if 1076*11225SDana.Myers@Sun.COM * applicable - ACPI_NOT_PACKAGE_ELEMENT 1077*11225SDana.Myers@Sun.COM * otherwise) 10789980SDana.Myers@Sun.COM * 10799980SDana.Myers@Sun.COM * RETURN: Status 10809980SDana.Myers@Sun.COM * 10819980SDana.Myers@Sun.COM * DESCRIPTION: Check the type of the return object against the expected object 10829980SDana.Myers@Sun.COM * type(s). Use of Btype allows multiple expected object types. 10839980SDana.Myers@Sun.COM * 10849980SDana.Myers@Sun.COM ******************************************************************************/ 10859980SDana.Myers@Sun.COM 10869980SDana.Myers@Sun.COM static ACPI_STATUS 10879980SDana.Myers@Sun.COM AcpiNsCheckObjectType ( 1088*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data, 10899980SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT **ReturnObjectPtr, 10909980SDana.Myers@Sun.COM UINT32 ExpectedBtypes, 10919980SDana.Myers@Sun.COM UINT32 PackageIndex) 10929980SDana.Myers@Sun.COM { 10939980SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ReturnObject = *ReturnObjectPtr; 10949980SDana.Myers@Sun.COM ACPI_STATUS Status = AE_OK; 10959980SDana.Myers@Sun.COM UINT32 ReturnBtype; 10969980SDana.Myers@Sun.COM char TypeBuffer[48]; /* Room for 5 types */ 10979980SDana.Myers@Sun.COM 10989980SDana.Myers@Sun.COM 10999980SDana.Myers@Sun.COM /* 11009980SDana.Myers@Sun.COM * If we get a NULL ReturnObject here, it is a NULL package element, 11019980SDana.Myers@Sun.COM * and this is always an error. 11029980SDana.Myers@Sun.COM */ 11039980SDana.Myers@Sun.COM if (!ReturnObject) 11049980SDana.Myers@Sun.COM { 11059980SDana.Myers@Sun.COM goto TypeErrorExit; 11069980SDana.Myers@Sun.COM } 11079980SDana.Myers@Sun.COM 11089980SDana.Myers@Sun.COM /* A Namespace node should not get here, but make sure */ 11099980SDana.Myers@Sun.COM 11109980SDana.Myers@Sun.COM if (ACPI_GET_DESCRIPTOR_TYPE (ReturnObject) == ACPI_DESC_TYPE_NAMED) 11119980SDana.Myers@Sun.COM { 1112*11225SDana.Myers@Sun.COM ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, 1113*11225SDana.Myers@Sun.COM "Invalid return type - Found a Namespace node [%4.4s] type %s", 1114*11225SDana.Myers@Sun.COM ReturnObject->Node.Name.Ascii, 11159980SDana.Myers@Sun.COM AcpiUtGetTypeName (ReturnObject->Node.Type))); 11169980SDana.Myers@Sun.COM return (AE_AML_OPERAND_TYPE); 11179980SDana.Myers@Sun.COM } 11189980SDana.Myers@Sun.COM 11199980SDana.Myers@Sun.COM /* 11209980SDana.Myers@Sun.COM * Convert the object type (ACPI_TYPE_xxx) to a bitmapped object type. 11219980SDana.Myers@Sun.COM * The bitmapped type allows multiple possible return types. 11229980SDana.Myers@Sun.COM * 11239980SDana.Myers@Sun.COM * Note, the cases below must handle all of the possible types returned 11249980SDana.Myers@Sun.COM * from all of the predefined names (including elements of returned 11259980SDana.Myers@Sun.COM * packages) 11269980SDana.Myers@Sun.COM */ 11279980SDana.Myers@Sun.COM switch (ReturnObject->Common.Type) 11289980SDana.Myers@Sun.COM { 11299980SDana.Myers@Sun.COM case ACPI_TYPE_INTEGER: 11309980SDana.Myers@Sun.COM ReturnBtype = ACPI_RTYPE_INTEGER; 11319980SDana.Myers@Sun.COM break; 11329980SDana.Myers@Sun.COM 11339980SDana.Myers@Sun.COM case ACPI_TYPE_BUFFER: 11349980SDana.Myers@Sun.COM ReturnBtype = ACPI_RTYPE_BUFFER; 11359980SDana.Myers@Sun.COM break; 11369980SDana.Myers@Sun.COM 11379980SDana.Myers@Sun.COM case ACPI_TYPE_STRING: 11389980SDana.Myers@Sun.COM ReturnBtype = ACPI_RTYPE_STRING; 11399980SDana.Myers@Sun.COM break; 11409980SDana.Myers@Sun.COM 11419980SDana.Myers@Sun.COM case ACPI_TYPE_PACKAGE: 11429980SDana.Myers@Sun.COM ReturnBtype = ACPI_RTYPE_PACKAGE; 11439980SDana.Myers@Sun.COM break; 11449980SDana.Myers@Sun.COM 11459980SDana.Myers@Sun.COM case ACPI_TYPE_LOCAL_REFERENCE: 11469980SDana.Myers@Sun.COM ReturnBtype = ACPI_RTYPE_REFERENCE; 11479980SDana.Myers@Sun.COM break; 11489980SDana.Myers@Sun.COM 11499980SDana.Myers@Sun.COM default: 11509980SDana.Myers@Sun.COM /* Not one of the supported objects, must be incorrect */ 11519980SDana.Myers@Sun.COM 11529980SDana.Myers@Sun.COM goto TypeErrorExit; 11539980SDana.Myers@Sun.COM } 11549980SDana.Myers@Sun.COM 11559980SDana.Myers@Sun.COM /* Is the object one of the expected types? */ 11569980SDana.Myers@Sun.COM 11579980SDana.Myers@Sun.COM if (!(ReturnBtype & ExpectedBtypes)) 11589980SDana.Myers@Sun.COM { 11599980SDana.Myers@Sun.COM /* Type mismatch -- attempt repair of the returned object */ 11609980SDana.Myers@Sun.COM 1161*11225SDana.Myers@Sun.COM Status = AcpiNsRepairObject (Data, ExpectedBtypes, 1162*11225SDana.Myers@Sun.COM PackageIndex, ReturnObjectPtr); 11639980SDana.Myers@Sun.COM if (ACPI_SUCCESS (Status)) 11649980SDana.Myers@Sun.COM { 1165*11225SDana.Myers@Sun.COM return (AE_OK); /* Repair was successful */ 11669980SDana.Myers@Sun.COM } 11679980SDana.Myers@Sun.COM goto TypeErrorExit; 11689980SDana.Myers@Sun.COM } 11699980SDana.Myers@Sun.COM 11709980SDana.Myers@Sun.COM /* For reference objects, check that the reference type is correct */ 11719980SDana.Myers@Sun.COM 11729980SDana.Myers@Sun.COM if (ReturnObject->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) 11739980SDana.Myers@Sun.COM { 1174*11225SDana.Myers@Sun.COM Status = AcpiNsCheckReference (Data, ReturnObject); 11759980SDana.Myers@Sun.COM } 11769980SDana.Myers@Sun.COM 11779980SDana.Myers@Sun.COM return (Status); 11789980SDana.Myers@Sun.COM 11799980SDana.Myers@Sun.COM 11809980SDana.Myers@Sun.COM TypeErrorExit: 11819980SDana.Myers@Sun.COM 11829980SDana.Myers@Sun.COM /* Create a string with all expected types for this predefined object */ 11839980SDana.Myers@Sun.COM 1184*11225SDana.Myers@Sun.COM AcpiNsGetExpectedTypes (TypeBuffer, ExpectedBtypes); 11859980SDana.Myers@Sun.COM 1186*11225SDana.Myers@Sun.COM if (PackageIndex == ACPI_NOT_PACKAGE_ELEMENT) 11879980SDana.Myers@Sun.COM { 1188*11225SDana.Myers@Sun.COM ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, 1189*11225SDana.Myers@Sun.COM "Return type mismatch - found %s, expected %s", 1190*11225SDana.Myers@Sun.COM AcpiUtGetObjectTypeName (ReturnObject), TypeBuffer)); 11919980SDana.Myers@Sun.COM } 11929980SDana.Myers@Sun.COM else 11939980SDana.Myers@Sun.COM { 1194*11225SDana.Myers@Sun.COM ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, 1195*11225SDana.Myers@Sun.COM "Return Package type mismatch at index %u - " 1196*11225SDana.Myers@Sun.COM "found %s, expected %s", PackageIndex, 11979980SDana.Myers@Sun.COM AcpiUtGetObjectTypeName (ReturnObject), TypeBuffer)); 11989980SDana.Myers@Sun.COM } 11999980SDana.Myers@Sun.COM 12009980SDana.Myers@Sun.COM return (AE_AML_OPERAND_TYPE); 12019980SDana.Myers@Sun.COM } 12029980SDana.Myers@Sun.COM 12039980SDana.Myers@Sun.COM 12049980SDana.Myers@Sun.COM /******************************************************************************* 12059980SDana.Myers@Sun.COM * 12069980SDana.Myers@Sun.COM * FUNCTION: AcpiNsCheckReference 12079980SDana.Myers@Sun.COM * 1208*11225SDana.Myers@Sun.COM * PARAMETERS: Data - Pointer to validation data structure 12099980SDana.Myers@Sun.COM * ReturnObject - Object returned from the evaluation of a 12109980SDana.Myers@Sun.COM * method or object 12119980SDana.Myers@Sun.COM * 12129980SDana.Myers@Sun.COM * RETURN: Status 12139980SDana.Myers@Sun.COM * 12149980SDana.Myers@Sun.COM * DESCRIPTION: Check a returned reference object for the correct reference 12159980SDana.Myers@Sun.COM * type. The only reference type that can be returned from a 12169980SDana.Myers@Sun.COM * predefined method is a named reference. All others are invalid. 12179980SDana.Myers@Sun.COM * 12189980SDana.Myers@Sun.COM ******************************************************************************/ 12199980SDana.Myers@Sun.COM 12209980SDana.Myers@Sun.COM static ACPI_STATUS 12219980SDana.Myers@Sun.COM AcpiNsCheckReference ( 1222*11225SDana.Myers@Sun.COM ACPI_PREDEFINED_DATA *Data, 12239980SDana.Myers@Sun.COM ACPI_OPERAND_OBJECT *ReturnObject) 12249980SDana.Myers@Sun.COM { 12259980SDana.Myers@Sun.COM 12269980SDana.Myers@Sun.COM /* 12279980SDana.Myers@Sun.COM * Check the reference object for the correct reference type (opcode). 12289980SDana.Myers@Sun.COM * The only type of reference that can be converted to an ACPI_OBJECT is 12299980SDana.Myers@Sun.COM * a reference to a named object (reference class: NAME) 12309980SDana.Myers@Sun.COM */ 12319980SDana.Myers@Sun.COM if (ReturnObject->Reference.Class == ACPI_REFCLASS_NAME) 12329980SDana.Myers@Sun.COM { 12339980SDana.Myers@Sun.COM return (AE_OK); 12349980SDana.Myers@Sun.COM } 12359980SDana.Myers@Sun.COM 1236*11225SDana.Myers@Sun.COM ACPI_WARN_PREDEFINED ((AE_INFO, Data->Pathname, Data->NodeFlags, 1237*11225SDana.Myers@Sun.COM "Return type mismatch - unexpected reference object type [%s] %2.2X", 1238*11225SDana.Myers@Sun.COM AcpiUtGetReferenceName (ReturnObject), 12399980SDana.Myers@Sun.COM ReturnObject->Reference.Class)); 12409980SDana.Myers@Sun.COM 12419980SDana.Myers@Sun.COM return (AE_AML_OPERAND_TYPE); 12429980SDana.Myers@Sun.COM } 12439980SDana.Myers@Sun.COM 12449980SDana.Myers@Sun.COM 12459980SDana.Myers@Sun.COM /******************************************************************************* 12469980SDana.Myers@Sun.COM * 1247*11225SDana.Myers@Sun.COM * FUNCTION: AcpiNsGetExpectedTypes 1248*11225SDana.Myers@Sun.COM * 1249*11225SDana.Myers@Sun.COM * PARAMETERS: Buffer - Pointer to where the string is returned 1250*11225SDana.Myers@Sun.COM * ExpectedBtypes - Bitmap of expected return type(s) 12519980SDana.Myers@Sun.COM * 1252*11225SDana.Myers@Sun.COM * RETURN: Buffer is populated with type names. 12539980SDana.Myers@Sun.COM * 1254*11225SDana.Myers@Sun.COM * DESCRIPTION: Translate the expected types bitmap into a string of ascii 1255*11225SDana.Myers@Sun.COM * names of expected types, for use in warning messages. 12569980SDana.Myers@Sun.COM * 12579980SDana.Myers@Sun.COM ******************************************************************************/ 12589980SDana.Myers@Sun.COM 1259*11225SDana.Myers@Sun.COM static void 1260*11225SDana.Myers@Sun.COM AcpiNsGetExpectedTypes ( 1261*11225SDana.Myers@Sun.COM char *Buffer, 1262*11225SDana.Myers@Sun.COM UINT32 ExpectedBtypes) 12639980SDana.Myers@Sun.COM { 1264*11225SDana.Myers@Sun.COM UINT32 ThisRtype; 1265*11225SDana.Myers@Sun.COM UINT32 i; 1266*11225SDana.Myers@Sun.COM UINT32 j; 12679980SDana.Myers@Sun.COM 12689980SDana.Myers@Sun.COM 1269*11225SDana.Myers@Sun.COM j = 1; 1270*11225SDana.Myers@Sun.COM Buffer[0] = 0; 1271*11225SDana.Myers@Sun.COM ThisRtype = ACPI_RTYPE_INTEGER; 12729980SDana.Myers@Sun.COM 1273*11225SDana.Myers@Sun.COM for (i = 0; i < ACPI_NUM_RTYPES; i++) 1274*11225SDana.Myers@Sun.COM { 1275*11225SDana.Myers@Sun.COM /* If one of the expected types, concatenate the name of this type */ 12769980SDana.Myers@Sun.COM 1277*11225SDana.Myers@Sun.COM if (ExpectedBtypes & ThisRtype) 12789980SDana.Myers@Sun.COM { 1279*11225SDana.Myers@Sun.COM ACPI_STRCAT (Buffer, &AcpiRtypeNames[i][j]); 1280*11225SDana.Myers@Sun.COM j = 0; /* Use name separator from now on */ 12819980SDana.Myers@Sun.COM } 1282*11225SDana.Myers@Sun.COM ThisRtype <<= 1; /* Next Rtype */ 12839980SDana.Myers@Sun.COM } 12849980SDana.Myers@Sun.COM } 1285