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
AcpiNsCheckPredefinedNames(ACPI_NAMESPACE_NODE * Node,UINT32 UserParamCount,ACPI_STATUS ReturnStatus,ACPI_OPERAND_OBJECT ** ReturnObjectPtr)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
AcpiNsCheckParameterCount(char * Pathname,ACPI_NAMESPACE_NODE * Node,UINT32 UserParamCount,const ACPI_PREDEFINED_INFO * Predefined)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 *
AcpiNsCheckForPredefinedName(ACPI_NAMESPACE_NODE * Node)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
AcpiNsCheckPackage(ACPI_PREDEFINED_DATA * Data,ACPI_OPERAND_OBJECT ** ReturnObjectPtr)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
AcpiNsCheckPackageList(ACPI_PREDEFINED_DATA * Data,const ACPI_PREDEFINED_INFO * Package,ACPI_OPERAND_OBJECT ** Elements,UINT32 Count)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
AcpiNsCheckPackageElements(ACPI_PREDEFINED_DATA * Data,ACPI_OPERAND_OBJECT ** Elements,UINT8 Type1,UINT32 Count1,UINT8 Type2,UINT32 Count2,UINT32 StartIndex)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
AcpiNsCheckObjectType(ACPI_PREDEFINED_DATA * Data,ACPI_OPERAND_OBJECT ** ReturnObjectPtr,UINT32 ExpectedBtypes,UINT32 PackageIndex)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
AcpiNsCheckReference(ACPI_PREDEFINED_DATA * Data,ACPI_OPERAND_OBJECT * ReturnObject)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
AcpiNsGetExpectedTypes(char * Buffer,UINT32 ExpectedBtypes)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