xref: /onnv-gate/usr/src/uts/intel/io/acpica/dispatcher/dsopcode.c (revision 9980:13d7f3eec672)
17851SDana.Myers@Sun.COM /******************************************************************************
27851SDana.Myers@Sun.COM  *
37851SDana.Myers@Sun.COM  * Module Name: dsopcode - Dispatcher Op Region support and handling of
47851SDana.Myers@Sun.COM  *                         "control" opcodes
57851SDana.Myers@Sun.COM  *
67851SDana.Myers@Sun.COM  *****************************************************************************/
77851SDana.Myers@Sun.COM 
87851SDana.Myers@Sun.COM /******************************************************************************
97851SDana.Myers@Sun.COM  *
107851SDana.Myers@Sun.COM  * 1. Copyright Notice
117851SDana.Myers@Sun.COM  *
12*9980SDana.Myers@Sun.COM  * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp.
137851SDana.Myers@Sun.COM  * All rights reserved.
147851SDana.Myers@Sun.COM  *
157851SDana.Myers@Sun.COM  * 2. License
167851SDana.Myers@Sun.COM  *
177851SDana.Myers@Sun.COM  * 2.1. This is your license from Intel Corp. under its intellectual property
187851SDana.Myers@Sun.COM  * rights.  You may have additional license terms from the party that provided
197851SDana.Myers@Sun.COM  * you this software, covering your right to use that party's intellectual
207851SDana.Myers@Sun.COM  * property rights.
217851SDana.Myers@Sun.COM  *
227851SDana.Myers@Sun.COM  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
237851SDana.Myers@Sun.COM  * copy of the source code appearing in this file ("Covered Code") an
247851SDana.Myers@Sun.COM  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
257851SDana.Myers@Sun.COM  * base code distributed originally by Intel ("Original Intel Code") to copy,
267851SDana.Myers@Sun.COM  * make derivatives, distribute, use and display any portion of the Covered
277851SDana.Myers@Sun.COM  * Code in any form, with the right to sublicense such rights; and
287851SDana.Myers@Sun.COM  *
297851SDana.Myers@Sun.COM  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
307851SDana.Myers@Sun.COM  * license (with the right to sublicense), under only those claims of Intel
317851SDana.Myers@Sun.COM  * patents that are infringed by the Original Intel Code, to make, use, sell,
327851SDana.Myers@Sun.COM  * offer to sell, and import the Covered Code and derivative works thereof
337851SDana.Myers@Sun.COM  * solely to the minimum extent necessary to exercise the above copyright
347851SDana.Myers@Sun.COM  * license, and in no event shall the patent license extend to any additions
357851SDana.Myers@Sun.COM  * to or modifications of the Original Intel Code.  No other license or right
367851SDana.Myers@Sun.COM  * is granted directly or by implication, estoppel or otherwise;
377851SDana.Myers@Sun.COM  *
387851SDana.Myers@Sun.COM  * The above copyright and patent license is granted only if the following
397851SDana.Myers@Sun.COM  * conditions are met:
407851SDana.Myers@Sun.COM  *
417851SDana.Myers@Sun.COM  * 3. Conditions
427851SDana.Myers@Sun.COM  *
437851SDana.Myers@Sun.COM  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
447851SDana.Myers@Sun.COM  * Redistribution of source code of any substantial portion of the Covered
457851SDana.Myers@Sun.COM  * Code or modification with rights to further distribute source must include
467851SDana.Myers@Sun.COM  * the above Copyright Notice, the above License, this list of Conditions,
477851SDana.Myers@Sun.COM  * and the following Disclaimer and Export Compliance provision.  In addition,
487851SDana.Myers@Sun.COM  * Licensee must cause all Covered Code to which Licensee contributes to
497851SDana.Myers@Sun.COM  * contain a file documenting the changes Licensee made to create that Covered
507851SDana.Myers@Sun.COM  * Code and the date of any change.  Licensee must include in that file the
517851SDana.Myers@Sun.COM  * documentation of any changes made by any predecessor Licensee.  Licensee
527851SDana.Myers@Sun.COM  * must include a prominent statement that the modification is derived,
537851SDana.Myers@Sun.COM  * directly or indirectly, from Original Intel Code.
547851SDana.Myers@Sun.COM  *
557851SDana.Myers@Sun.COM  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
567851SDana.Myers@Sun.COM  * Redistribution of source code of any substantial portion of the Covered
577851SDana.Myers@Sun.COM  * Code or modification without rights to further distribute source must
587851SDana.Myers@Sun.COM  * include the following Disclaimer and Export Compliance provision in the
597851SDana.Myers@Sun.COM  * documentation and/or other materials provided with distribution.  In
607851SDana.Myers@Sun.COM  * addition, Licensee may not authorize further sublicense of source of any
617851SDana.Myers@Sun.COM  * portion of the Covered Code, and must include terms to the effect that the
627851SDana.Myers@Sun.COM  * license from Licensee to its licensee is limited to the intellectual
637851SDana.Myers@Sun.COM  * property embodied in the software Licensee provides to its licensee, and
647851SDana.Myers@Sun.COM  * not to intellectual property embodied in modifications its licensee may
657851SDana.Myers@Sun.COM  * make.
667851SDana.Myers@Sun.COM  *
677851SDana.Myers@Sun.COM  * 3.3. Redistribution of Executable. Redistribution in executable form of any
687851SDana.Myers@Sun.COM  * substantial portion of the Covered Code or modification must reproduce the
697851SDana.Myers@Sun.COM  * above Copyright Notice, and the following Disclaimer and Export Compliance
707851SDana.Myers@Sun.COM  * provision in the documentation and/or other materials provided with the
717851SDana.Myers@Sun.COM  * distribution.
727851SDana.Myers@Sun.COM  *
737851SDana.Myers@Sun.COM  * 3.4. Intel retains all right, title, and interest in and to the Original
747851SDana.Myers@Sun.COM  * Intel Code.
757851SDana.Myers@Sun.COM  *
767851SDana.Myers@Sun.COM  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
777851SDana.Myers@Sun.COM  * Intel shall be used in advertising or otherwise to promote the sale, use or
787851SDana.Myers@Sun.COM  * other dealings in products derived from or relating to the Covered Code
797851SDana.Myers@Sun.COM  * without prior written authorization from Intel.
807851SDana.Myers@Sun.COM  *
817851SDana.Myers@Sun.COM  * 4. Disclaimer and Export Compliance
827851SDana.Myers@Sun.COM  *
837851SDana.Myers@Sun.COM  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
847851SDana.Myers@Sun.COM  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
857851SDana.Myers@Sun.COM  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
867851SDana.Myers@Sun.COM  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
877851SDana.Myers@Sun.COM  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
887851SDana.Myers@Sun.COM  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
897851SDana.Myers@Sun.COM  * PARTICULAR PURPOSE.
907851SDana.Myers@Sun.COM  *
917851SDana.Myers@Sun.COM  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
927851SDana.Myers@Sun.COM  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
937851SDana.Myers@Sun.COM  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
947851SDana.Myers@Sun.COM  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
957851SDana.Myers@Sun.COM  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
967851SDana.Myers@Sun.COM  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
977851SDana.Myers@Sun.COM  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
987851SDana.Myers@Sun.COM  * LIMITED REMEDY.
997851SDana.Myers@Sun.COM  *
1007851SDana.Myers@Sun.COM  * 4.3. Licensee shall not export, either directly or indirectly, any of this
1017851SDana.Myers@Sun.COM  * software or system incorporating such software without first obtaining any
1027851SDana.Myers@Sun.COM  * required license or other approval from the U. S. Department of Commerce or
1037851SDana.Myers@Sun.COM  * any other agency or department of the United States Government.  In the
1047851SDana.Myers@Sun.COM  * event Licensee exports any such software from the United States or
1057851SDana.Myers@Sun.COM  * re-exports any such software from a foreign destination, Licensee shall
1067851SDana.Myers@Sun.COM  * ensure that the distribution and export/re-export of the software is in
1077851SDana.Myers@Sun.COM  * compliance with all laws, regulations, orders, or other restrictions of the
1087851SDana.Myers@Sun.COM  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
1097851SDana.Myers@Sun.COM  * any of its subsidiaries will export/re-export any technical data, process,
1107851SDana.Myers@Sun.COM  * software, or service, directly or indirectly, to any country for which the
1117851SDana.Myers@Sun.COM  * United States government or any agency thereof requires an export license,
1127851SDana.Myers@Sun.COM  * other governmental approval, or letter of assurance, without first obtaining
1137851SDana.Myers@Sun.COM  * such license, approval or letter.
1147851SDana.Myers@Sun.COM  *
1157851SDana.Myers@Sun.COM  *****************************************************************************/
1167851SDana.Myers@Sun.COM 
1177851SDana.Myers@Sun.COM #define __DSOPCODE_C__
1187851SDana.Myers@Sun.COM 
1197851SDana.Myers@Sun.COM #include "acpi.h"
120*9980SDana.Myers@Sun.COM #include "accommon.h"
1217851SDana.Myers@Sun.COM #include "acparser.h"
1227851SDana.Myers@Sun.COM #include "amlcode.h"
1237851SDana.Myers@Sun.COM #include "acdispat.h"
1247851SDana.Myers@Sun.COM #include "acinterp.h"
1257851SDana.Myers@Sun.COM #include "acnamesp.h"
1267851SDana.Myers@Sun.COM #include "acevents.h"
1277851SDana.Myers@Sun.COM #include "actables.h"
1287851SDana.Myers@Sun.COM 
1297851SDana.Myers@Sun.COM #define _COMPONENT          ACPI_DISPATCHER
1307851SDana.Myers@Sun.COM         ACPI_MODULE_NAME    ("dsopcode")
1317851SDana.Myers@Sun.COM 
1327851SDana.Myers@Sun.COM /* Local prototypes */
1337851SDana.Myers@Sun.COM 
1347851SDana.Myers@Sun.COM static ACPI_STATUS
1357851SDana.Myers@Sun.COM AcpiDsExecuteArguments (
1367851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *Node,
1377851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *ScopeNode,
1387851SDana.Myers@Sun.COM     UINT32                  AmlLength,
1397851SDana.Myers@Sun.COM     UINT8                   *AmlStart);
1407851SDana.Myers@Sun.COM 
1417851SDana.Myers@Sun.COM static ACPI_STATUS
1427851SDana.Myers@Sun.COM AcpiDsInitBufferField (
1437851SDana.Myers@Sun.COM     UINT16                  AmlOpcode,
1447851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc,
1457851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *BufferDesc,
1467851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *OffsetDesc,
1477851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *LengthDesc,
1487851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ResultDesc);
1497851SDana.Myers@Sun.COM 
1507851SDana.Myers@Sun.COM 
1517851SDana.Myers@Sun.COM /*******************************************************************************
1527851SDana.Myers@Sun.COM  *
1537851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsExecuteArguments
1547851SDana.Myers@Sun.COM  *
1557851SDana.Myers@Sun.COM  * PARAMETERS:  Node                - Object NS node
1567851SDana.Myers@Sun.COM  *              ScopeNode           - Parent NS node
1577851SDana.Myers@Sun.COM  *              AmlLength           - Length of executable AML
1587851SDana.Myers@Sun.COM  *              AmlStart            - Pointer to the AML
1597851SDana.Myers@Sun.COM  *
1607851SDana.Myers@Sun.COM  * RETURN:      Status.
1617851SDana.Myers@Sun.COM  *
1627851SDana.Myers@Sun.COM  * DESCRIPTION: Late (deferred) execution of region or field arguments
1637851SDana.Myers@Sun.COM  *
1647851SDana.Myers@Sun.COM  ******************************************************************************/
1657851SDana.Myers@Sun.COM 
1667851SDana.Myers@Sun.COM static ACPI_STATUS
AcpiDsExecuteArguments(ACPI_NAMESPACE_NODE * Node,ACPI_NAMESPACE_NODE * ScopeNode,UINT32 AmlLength,UINT8 * AmlStart)1677851SDana.Myers@Sun.COM AcpiDsExecuteArguments (
1687851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *Node,
1697851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *ScopeNode,
1707851SDana.Myers@Sun.COM     UINT32                  AmlLength,
1717851SDana.Myers@Sun.COM     UINT8                   *AmlStart)
1727851SDana.Myers@Sun.COM {
1737851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
1747851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Op;
1757851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState;
1767851SDana.Myers@Sun.COM 
1777851SDana.Myers@Sun.COM 
1787851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (DsExecuteArguments);
1797851SDana.Myers@Sun.COM 
1807851SDana.Myers@Sun.COM 
1817851SDana.Myers@Sun.COM     /*
1827851SDana.Myers@Sun.COM      * Allocate a new parser op to be the root of the parsed tree
1837851SDana.Myers@Sun.COM      */
1847851SDana.Myers@Sun.COM     Op = AcpiPsAllocOp (AML_INT_EVAL_SUBTREE_OP);
1857851SDana.Myers@Sun.COM     if (!Op)
1867851SDana.Myers@Sun.COM     {
1877851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_NO_MEMORY);
1887851SDana.Myers@Sun.COM     }
1897851SDana.Myers@Sun.COM 
1907851SDana.Myers@Sun.COM     /* Save the Node for use in AcpiPsParseAml */
1917851SDana.Myers@Sun.COM 
1927851SDana.Myers@Sun.COM     Op->Common.Node = ScopeNode;
1937851SDana.Myers@Sun.COM 
1947851SDana.Myers@Sun.COM     /* Create and initialize a new parser state */
1957851SDana.Myers@Sun.COM 
1967851SDana.Myers@Sun.COM     WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
1977851SDana.Myers@Sun.COM     if (!WalkState)
1987851SDana.Myers@Sun.COM     {
1997851SDana.Myers@Sun.COM         Status = AE_NO_MEMORY;
2007851SDana.Myers@Sun.COM         goto Cleanup;
2017851SDana.Myers@Sun.COM     }
2027851SDana.Myers@Sun.COM 
2037851SDana.Myers@Sun.COM     Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, AmlStart,
2047851SDana.Myers@Sun.COM                     AmlLength, NULL, ACPI_IMODE_LOAD_PASS1);
2057851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
2067851SDana.Myers@Sun.COM     {
2077851SDana.Myers@Sun.COM         AcpiDsDeleteWalkState (WalkState);
2087851SDana.Myers@Sun.COM         goto Cleanup;
2097851SDana.Myers@Sun.COM     }
2107851SDana.Myers@Sun.COM 
2117851SDana.Myers@Sun.COM     /* Mark this parse as a deferred opcode */
2127851SDana.Myers@Sun.COM 
2137851SDana.Myers@Sun.COM     WalkState->ParseFlags = ACPI_PARSE_DEFERRED_OP;
2147851SDana.Myers@Sun.COM     WalkState->DeferredNode = Node;
2157851SDana.Myers@Sun.COM 
2167851SDana.Myers@Sun.COM     /* Pass1: Parse the entire declaration */
2177851SDana.Myers@Sun.COM 
2187851SDana.Myers@Sun.COM     Status = AcpiPsParseAml (WalkState);
2197851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
2207851SDana.Myers@Sun.COM     {
2217851SDana.Myers@Sun.COM         goto Cleanup;
2227851SDana.Myers@Sun.COM     }
2237851SDana.Myers@Sun.COM 
2247851SDana.Myers@Sun.COM     /* Get and init the Op created above */
2257851SDana.Myers@Sun.COM 
2267851SDana.Myers@Sun.COM     Op->Common.Node = Node;
2277851SDana.Myers@Sun.COM     AcpiPsDeleteParseTree (Op);
2287851SDana.Myers@Sun.COM 
2297851SDana.Myers@Sun.COM     /* Evaluate the deferred arguments */
2307851SDana.Myers@Sun.COM 
2317851SDana.Myers@Sun.COM     Op = AcpiPsAllocOp (AML_INT_EVAL_SUBTREE_OP);
2327851SDana.Myers@Sun.COM     if (!Op)
2337851SDana.Myers@Sun.COM     {
2347851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_NO_MEMORY);
2357851SDana.Myers@Sun.COM     }
2367851SDana.Myers@Sun.COM 
2377851SDana.Myers@Sun.COM     Op->Common.Node = ScopeNode;
2387851SDana.Myers@Sun.COM 
2397851SDana.Myers@Sun.COM     /* Create and initialize a new parser state */
2407851SDana.Myers@Sun.COM 
2417851SDana.Myers@Sun.COM     WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
2427851SDana.Myers@Sun.COM     if (!WalkState)
2437851SDana.Myers@Sun.COM     {
2447851SDana.Myers@Sun.COM         Status = AE_NO_MEMORY;
2457851SDana.Myers@Sun.COM         goto Cleanup;
2467851SDana.Myers@Sun.COM     }
2477851SDana.Myers@Sun.COM 
2487851SDana.Myers@Sun.COM     /* Execute the opcode and arguments */
2497851SDana.Myers@Sun.COM 
2507851SDana.Myers@Sun.COM     Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, AmlStart,
2517851SDana.Myers@Sun.COM                     AmlLength, NULL, ACPI_IMODE_EXECUTE);
2527851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
2537851SDana.Myers@Sun.COM     {
2547851SDana.Myers@Sun.COM         AcpiDsDeleteWalkState (WalkState);
2557851SDana.Myers@Sun.COM         goto Cleanup;
2567851SDana.Myers@Sun.COM     }
2577851SDana.Myers@Sun.COM 
2587851SDana.Myers@Sun.COM     /* Mark this execution as a deferred opcode */
2597851SDana.Myers@Sun.COM 
2607851SDana.Myers@Sun.COM     WalkState->DeferredNode = Node;
2617851SDana.Myers@Sun.COM     Status = AcpiPsParseAml (WalkState);
2627851SDana.Myers@Sun.COM 
2637851SDana.Myers@Sun.COM Cleanup:
2647851SDana.Myers@Sun.COM     AcpiPsDeleteParseTree (Op);
2657851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
2667851SDana.Myers@Sun.COM }
2677851SDana.Myers@Sun.COM 
2687851SDana.Myers@Sun.COM 
2697851SDana.Myers@Sun.COM /*******************************************************************************
2707851SDana.Myers@Sun.COM  *
2717851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsGetBufferFieldArguments
2727851SDana.Myers@Sun.COM  *
2737851SDana.Myers@Sun.COM  * PARAMETERS:  ObjDesc         - A valid BufferField object
2747851SDana.Myers@Sun.COM  *
2757851SDana.Myers@Sun.COM  * RETURN:      Status.
2767851SDana.Myers@Sun.COM  *
2777851SDana.Myers@Sun.COM  * DESCRIPTION: Get BufferField Buffer and Index.  This implements the late
2787851SDana.Myers@Sun.COM  *              evaluation of these field attributes.
2797851SDana.Myers@Sun.COM  *
2807851SDana.Myers@Sun.COM  ******************************************************************************/
2817851SDana.Myers@Sun.COM 
2827851SDana.Myers@Sun.COM ACPI_STATUS
AcpiDsGetBufferFieldArguments(ACPI_OPERAND_OBJECT * ObjDesc)2837851SDana.Myers@Sun.COM AcpiDsGetBufferFieldArguments (
2847851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc)
2857851SDana.Myers@Sun.COM {
2867851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ExtraDesc;
2877851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *Node;
2887851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
2897851SDana.Myers@Sun.COM 
2907851SDana.Myers@Sun.COM 
2917851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_PTR (DsGetBufferFieldArguments, ObjDesc);
2927851SDana.Myers@Sun.COM 
2937851SDana.Myers@Sun.COM 
2947851SDana.Myers@Sun.COM     if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
2957851SDana.Myers@Sun.COM     {
2967851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_OK);
2977851SDana.Myers@Sun.COM     }
2987851SDana.Myers@Sun.COM 
2997851SDana.Myers@Sun.COM     /* Get the AML pointer (method object) and BufferField node */
3007851SDana.Myers@Sun.COM 
3017851SDana.Myers@Sun.COM     ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc);
3027851SDana.Myers@Sun.COM     Node = ObjDesc->BufferField.Node;
3037851SDana.Myers@Sun.COM 
3047851SDana.Myers@Sun.COM     ACPI_DEBUG_EXEC(AcpiUtDisplayInitPathname (ACPI_TYPE_BUFFER_FIELD, Node, NULL));
3057851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] BufferField Arg Init\n",
3067851SDana.Myers@Sun.COM         AcpiUtGetNodeName (Node)));
3077851SDana.Myers@Sun.COM 
3087851SDana.Myers@Sun.COM     /* Execute the AML code for the TermArg arguments */
3097851SDana.Myers@Sun.COM 
3107851SDana.Myers@Sun.COM     Status = AcpiDsExecuteArguments (Node, AcpiNsGetParentNode (Node),
3117851SDana.Myers@Sun.COM                 ExtraDesc->Extra.AmlLength, ExtraDesc->Extra.AmlStart);
3127851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
3137851SDana.Myers@Sun.COM }
3147851SDana.Myers@Sun.COM 
3157851SDana.Myers@Sun.COM 
3167851SDana.Myers@Sun.COM /*******************************************************************************
3177851SDana.Myers@Sun.COM  *
3187851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsGetBankFieldArguments
3197851SDana.Myers@Sun.COM  *
3207851SDana.Myers@Sun.COM  * PARAMETERS:  ObjDesc         - A valid BankField object
3217851SDana.Myers@Sun.COM  *
3227851SDana.Myers@Sun.COM  * RETURN:      Status.
3237851SDana.Myers@Sun.COM  *
3247851SDana.Myers@Sun.COM  * DESCRIPTION: Get BankField BankValue.  This implements the late
3257851SDana.Myers@Sun.COM  *              evaluation of these field attributes.
3267851SDana.Myers@Sun.COM  *
3277851SDana.Myers@Sun.COM  ******************************************************************************/
3287851SDana.Myers@Sun.COM 
3297851SDana.Myers@Sun.COM ACPI_STATUS
AcpiDsGetBankFieldArguments(ACPI_OPERAND_OBJECT * ObjDesc)3307851SDana.Myers@Sun.COM AcpiDsGetBankFieldArguments (
3317851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc)
3327851SDana.Myers@Sun.COM {
3337851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ExtraDesc;
3347851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *Node;
3357851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
3367851SDana.Myers@Sun.COM 
3377851SDana.Myers@Sun.COM 
3387851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_PTR (DsGetBankFieldArguments, ObjDesc);
3397851SDana.Myers@Sun.COM 
3407851SDana.Myers@Sun.COM 
3417851SDana.Myers@Sun.COM     if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
3427851SDana.Myers@Sun.COM     {
3437851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_OK);
3447851SDana.Myers@Sun.COM     }
3457851SDana.Myers@Sun.COM 
3467851SDana.Myers@Sun.COM     /* Get the AML pointer (method object) and BankField node */
3477851SDana.Myers@Sun.COM 
3487851SDana.Myers@Sun.COM     ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc);
3497851SDana.Myers@Sun.COM     Node = ObjDesc->BankField.Node;
3507851SDana.Myers@Sun.COM 
3517851SDana.Myers@Sun.COM     ACPI_DEBUG_EXEC(AcpiUtDisplayInitPathname (ACPI_TYPE_LOCAL_BANK_FIELD, Node, NULL));
3527851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] BankField Arg Init\n",
3537851SDana.Myers@Sun.COM         AcpiUtGetNodeName (Node)));
3547851SDana.Myers@Sun.COM 
3557851SDana.Myers@Sun.COM     /* Execute the AML code for the TermArg arguments */
3567851SDana.Myers@Sun.COM 
3577851SDana.Myers@Sun.COM     Status = AcpiDsExecuteArguments (Node, AcpiNsGetParentNode (Node),
3587851SDana.Myers@Sun.COM                 ExtraDesc->Extra.AmlLength, ExtraDesc->Extra.AmlStart);
3597851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
3607851SDana.Myers@Sun.COM }
3617851SDana.Myers@Sun.COM 
3627851SDana.Myers@Sun.COM 
3637851SDana.Myers@Sun.COM /*******************************************************************************
3647851SDana.Myers@Sun.COM  *
3657851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsGetBufferArguments
3667851SDana.Myers@Sun.COM  *
3677851SDana.Myers@Sun.COM  * PARAMETERS:  ObjDesc         - A valid Buffer object
3687851SDana.Myers@Sun.COM  *
3697851SDana.Myers@Sun.COM  * RETURN:      Status.
3707851SDana.Myers@Sun.COM  *
3717851SDana.Myers@Sun.COM  * DESCRIPTION: Get Buffer length and initializer byte list.  This implements
3727851SDana.Myers@Sun.COM  *              the late evaluation of these attributes.
3737851SDana.Myers@Sun.COM  *
3747851SDana.Myers@Sun.COM  ******************************************************************************/
3757851SDana.Myers@Sun.COM 
3767851SDana.Myers@Sun.COM ACPI_STATUS
AcpiDsGetBufferArguments(ACPI_OPERAND_OBJECT * ObjDesc)3777851SDana.Myers@Sun.COM AcpiDsGetBufferArguments (
3787851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc)
3797851SDana.Myers@Sun.COM {
3807851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *Node;
3817851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
3827851SDana.Myers@Sun.COM 
3837851SDana.Myers@Sun.COM 
3847851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_PTR (DsGetBufferArguments, ObjDesc);
3857851SDana.Myers@Sun.COM 
3867851SDana.Myers@Sun.COM 
3877851SDana.Myers@Sun.COM     if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
3887851SDana.Myers@Sun.COM     {
3897851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_OK);
3907851SDana.Myers@Sun.COM     }
3917851SDana.Myers@Sun.COM 
3927851SDana.Myers@Sun.COM     /* Get the Buffer node */
3937851SDana.Myers@Sun.COM 
3947851SDana.Myers@Sun.COM     Node = ObjDesc->Buffer.Node;
3957851SDana.Myers@Sun.COM     if (!Node)
3967851SDana.Myers@Sun.COM     {
3977851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO,
3987851SDana.Myers@Sun.COM             "No pointer back to NS node in buffer obj %p", ObjDesc));
3997851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_AML_INTERNAL);
4007851SDana.Myers@Sun.COM     }
4017851SDana.Myers@Sun.COM 
4027851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Buffer Arg Init\n"));
4037851SDana.Myers@Sun.COM 
4047851SDana.Myers@Sun.COM     /* Execute the AML code for the TermArg arguments */
4057851SDana.Myers@Sun.COM 
4067851SDana.Myers@Sun.COM     Status = AcpiDsExecuteArguments (Node, Node,
4077851SDana.Myers@Sun.COM                 ObjDesc->Buffer.AmlLength, ObjDesc->Buffer.AmlStart);
4087851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
4097851SDana.Myers@Sun.COM }
4107851SDana.Myers@Sun.COM 
4117851SDana.Myers@Sun.COM 
4127851SDana.Myers@Sun.COM /*******************************************************************************
4137851SDana.Myers@Sun.COM  *
4147851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsGetPackageArguments
4157851SDana.Myers@Sun.COM  *
4167851SDana.Myers@Sun.COM  * PARAMETERS:  ObjDesc         - A valid Package object
4177851SDana.Myers@Sun.COM  *
4187851SDana.Myers@Sun.COM  * RETURN:      Status.
4197851SDana.Myers@Sun.COM  *
4207851SDana.Myers@Sun.COM  * DESCRIPTION: Get Package length and initializer byte list.  This implements
4217851SDana.Myers@Sun.COM  *              the late evaluation of these attributes.
4227851SDana.Myers@Sun.COM  *
4237851SDana.Myers@Sun.COM  ******************************************************************************/
4247851SDana.Myers@Sun.COM 
4257851SDana.Myers@Sun.COM ACPI_STATUS
AcpiDsGetPackageArguments(ACPI_OPERAND_OBJECT * ObjDesc)4267851SDana.Myers@Sun.COM AcpiDsGetPackageArguments (
4277851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc)
4287851SDana.Myers@Sun.COM {
4297851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *Node;
4307851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
4317851SDana.Myers@Sun.COM 
4327851SDana.Myers@Sun.COM 
4337851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_PTR (DsGetPackageArguments, ObjDesc);
4347851SDana.Myers@Sun.COM 
4357851SDana.Myers@Sun.COM 
4367851SDana.Myers@Sun.COM     if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
4377851SDana.Myers@Sun.COM     {
4387851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_OK);
4397851SDana.Myers@Sun.COM     }
4407851SDana.Myers@Sun.COM 
4417851SDana.Myers@Sun.COM     /* Get the Package node */
4427851SDana.Myers@Sun.COM 
4437851SDana.Myers@Sun.COM     Node = ObjDesc->Package.Node;
4447851SDana.Myers@Sun.COM     if (!Node)
4457851SDana.Myers@Sun.COM     {
4467851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO,
4477851SDana.Myers@Sun.COM             "No pointer back to NS node in package %p", ObjDesc));
4487851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_AML_INTERNAL);
4497851SDana.Myers@Sun.COM     }
4507851SDana.Myers@Sun.COM 
4517851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package Arg Init\n"));
4527851SDana.Myers@Sun.COM 
4537851SDana.Myers@Sun.COM     /* Execute the AML code for the TermArg arguments */
4547851SDana.Myers@Sun.COM 
4557851SDana.Myers@Sun.COM     Status = AcpiDsExecuteArguments (Node, Node,
4567851SDana.Myers@Sun.COM                 ObjDesc->Package.AmlLength, ObjDesc->Package.AmlStart);
4577851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
4587851SDana.Myers@Sun.COM }
4597851SDana.Myers@Sun.COM 
4607851SDana.Myers@Sun.COM 
4617851SDana.Myers@Sun.COM /*****************************************************************************
4627851SDana.Myers@Sun.COM  *
4637851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsGetRegionArguments
4647851SDana.Myers@Sun.COM  *
4657851SDana.Myers@Sun.COM  * PARAMETERS:  ObjDesc         - A valid region object
4667851SDana.Myers@Sun.COM  *
4677851SDana.Myers@Sun.COM  * RETURN:      Status.
4687851SDana.Myers@Sun.COM  *
4697851SDana.Myers@Sun.COM  * DESCRIPTION: Get region address and length.  This implements the late
4707851SDana.Myers@Sun.COM  *              evaluation of these region attributes.
4717851SDana.Myers@Sun.COM  *
4727851SDana.Myers@Sun.COM  ****************************************************************************/
4737851SDana.Myers@Sun.COM 
4747851SDana.Myers@Sun.COM ACPI_STATUS
AcpiDsGetRegionArguments(ACPI_OPERAND_OBJECT * ObjDesc)4757851SDana.Myers@Sun.COM AcpiDsGetRegionArguments (
4767851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc)
4777851SDana.Myers@Sun.COM {
4787851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *Node;
4797851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
4807851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ExtraDesc;
4817851SDana.Myers@Sun.COM 
4827851SDana.Myers@Sun.COM 
4837851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_PTR (DsGetRegionArguments, ObjDesc);
4847851SDana.Myers@Sun.COM 
4857851SDana.Myers@Sun.COM 
4867851SDana.Myers@Sun.COM     if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID)
4877851SDana.Myers@Sun.COM     {
4887851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_OK);
4897851SDana.Myers@Sun.COM     }
4907851SDana.Myers@Sun.COM 
4917851SDana.Myers@Sun.COM     ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc);
4927851SDana.Myers@Sun.COM     if (!ExtraDesc)
4937851SDana.Myers@Sun.COM     {
4947851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_NOT_EXIST);
4957851SDana.Myers@Sun.COM     }
4967851SDana.Myers@Sun.COM 
4977851SDana.Myers@Sun.COM     /* Get the Region node */
4987851SDana.Myers@Sun.COM 
4997851SDana.Myers@Sun.COM     Node = ObjDesc->Region.Node;
5007851SDana.Myers@Sun.COM 
5017851SDana.Myers@Sun.COM     ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (ACPI_TYPE_REGION, Node, NULL));
5027851SDana.Myers@Sun.COM 
5037851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] OpRegion Arg Init at AML %p\n",
5047851SDana.Myers@Sun.COM         AcpiUtGetNodeName (Node), ExtraDesc->Extra.AmlStart));
5057851SDana.Myers@Sun.COM 
5067851SDana.Myers@Sun.COM     /* Execute the argument AML */
5077851SDana.Myers@Sun.COM 
5087851SDana.Myers@Sun.COM     Status = AcpiDsExecuteArguments (Node, AcpiNsGetParentNode (Node),
5097851SDana.Myers@Sun.COM                 ExtraDesc->Extra.AmlLength, ExtraDesc->Extra.AmlStart);
5107851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
5117851SDana.Myers@Sun.COM }
5127851SDana.Myers@Sun.COM 
5137851SDana.Myers@Sun.COM 
5147851SDana.Myers@Sun.COM /*******************************************************************************
5157851SDana.Myers@Sun.COM  *
5167851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsInitializeRegion
5177851SDana.Myers@Sun.COM  *
5187851SDana.Myers@Sun.COM  * PARAMETERS:  ObjHandle       - Region namespace node
5197851SDana.Myers@Sun.COM  *
5207851SDana.Myers@Sun.COM  * RETURN:      Status
5217851SDana.Myers@Sun.COM  *
5227851SDana.Myers@Sun.COM  * DESCRIPTION: Front end to EvInitializeRegion
5237851SDana.Myers@Sun.COM  *
5247851SDana.Myers@Sun.COM  ******************************************************************************/
5257851SDana.Myers@Sun.COM 
5267851SDana.Myers@Sun.COM ACPI_STATUS
AcpiDsInitializeRegion(ACPI_HANDLE ObjHandle)5277851SDana.Myers@Sun.COM AcpiDsInitializeRegion (
5287851SDana.Myers@Sun.COM     ACPI_HANDLE             ObjHandle)
5297851SDana.Myers@Sun.COM {
5307851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc;
5317851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
5327851SDana.Myers@Sun.COM 
5337851SDana.Myers@Sun.COM 
5347851SDana.Myers@Sun.COM     ObjDesc = AcpiNsGetAttachedObject (ObjHandle);
5357851SDana.Myers@Sun.COM 
5367851SDana.Myers@Sun.COM     /* Namespace is NOT locked */
5377851SDana.Myers@Sun.COM 
5387851SDana.Myers@Sun.COM     Status = AcpiEvInitializeRegion (ObjDesc, FALSE);
5397851SDana.Myers@Sun.COM     return (Status);
5407851SDana.Myers@Sun.COM }
5417851SDana.Myers@Sun.COM 
5427851SDana.Myers@Sun.COM 
5437851SDana.Myers@Sun.COM /*******************************************************************************
5447851SDana.Myers@Sun.COM  *
5457851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsInitBufferField
5467851SDana.Myers@Sun.COM  *
5477851SDana.Myers@Sun.COM  * PARAMETERS:  AmlOpcode       - CreateXxxField
5487851SDana.Myers@Sun.COM  *              ObjDesc         - BufferField object
5497851SDana.Myers@Sun.COM  *              BufferDesc      - Host Buffer
5507851SDana.Myers@Sun.COM  *              OffsetDesc      - Offset into buffer
5517851SDana.Myers@Sun.COM  *              LengthDesc      - Length of field (CREATE_FIELD_OP only)
5527851SDana.Myers@Sun.COM  *              ResultDesc      - Where to store the result
5537851SDana.Myers@Sun.COM  *
5547851SDana.Myers@Sun.COM  * RETURN:      Status
5557851SDana.Myers@Sun.COM  *
5567851SDana.Myers@Sun.COM  * DESCRIPTION: Perform actual initialization of a buffer field
5577851SDana.Myers@Sun.COM  *
5587851SDana.Myers@Sun.COM  ******************************************************************************/
5597851SDana.Myers@Sun.COM 
5607851SDana.Myers@Sun.COM static ACPI_STATUS
AcpiDsInitBufferField(UINT16 AmlOpcode,ACPI_OPERAND_OBJECT * ObjDesc,ACPI_OPERAND_OBJECT * BufferDesc,ACPI_OPERAND_OBJECT * OffsetDesc,ACPI_OPERAND_OBJECT * LengthDesc,ACPI_OPERAND_OBJECT * ResultDesc)5617851SDana.Myers@Sun.COM AcpiDsInitBufferField (
5627851SDana.Myers@Sun.COM     UINT16                  AmlOpcode,
5637851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc,
5647851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *BufferDesc,
5657851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *OffsetDesc,
5667851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *LengthDesc,
5677851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ResultDesc)
5687851SDana.Myers@Sun.COM {
5697851SDana.Myers@Sun.COM     UINT32                  Offset;
5707851SDana.Myers@Sun.COM     UINT32                  BitOffset;
5717851SDana.Myers@Sun.COM     UINT32                  BitCount;
5727851SDana.Myers@Sun.COM     UINT8                   FieldFlags;
5737851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
5747851SDana.Myers@Sun.COM 
5757851SDana.Myers@Sun.COM 
5767851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_PTR (DsInitBufferField, ObjDesc);
5777851SDana.Myers@Sun.COM 
5787851SDana.Myers@Sun.COM 
5797851SDana.Myers@Sun.COM     /* Host object must be a Buffer */
5807851SDana.Myers@Sun.COM 
581*9980SDana.Myers@Sun.COM     if (BufferDesc->Common.Type != ACPI_TYPE_BUFFER)
5827851SDana.Myers@Sun.COM     {
5837851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO,
5847851SDana.Myers@Sun.COM             "Target of Create Field is not a Buffer object - %s",
5857851SDana.Myers@Sun.COM             AcpiUtGetObjectTypeName (BufferDesc)));
5867851SDana.Myers@Sun.COM 
5877851SDana.Myers@Sun.COM         Status = AE_AML_OPERAND_TYPE;
5887851SDana.Myers@Sun.COM         goto Cleanup;
5897851SDana.Myers@Sun.COM     }
5907851SDana.Myers@Sun.COM 
5917851SDana.Myers@Sun.COM     /*
5927851SDana.Myers@Sun.COM      * The last parameter to all of these opcodes (ResultDesc) started
5937851SDana.Myers@Sun.COM      * out as a NameString, and should therefore now be a NS node
5947851SDana.Myers@Sun.COM      * after resolution in AcpiExResolveOperands().
5957851SDana.Myers@Sun.COM      */
5967851SDana.Myers@Sun.COM     if (ACPI_GET_DESCRIPTOR_TYPE (ResultDesc) != ACPI_DESC_TYPE_NAMED)
5977851SDana.Myers@Sun.COM     {
5987851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO,
5997851SDana.Myers@Sun.COM             "(%s) destination not a NS Node [%s]",
6007851SDana.Myers@Sun.COM             AcpiPsGetOpcodeName (AmlOpcode),
6017851SDana.Myers@Sun.COM             AcpiUtGetDescriptorName (ResultDesc)));
6027851SDana.Myers@Sun.COM 
6037851SDana.Myers@Sun.COM         Status = AE_AML_OPERAND_TYPE;
6047851SDana.Myers@Sun.COM         goto Cleanup;
6057851SDana.Myers@Sun.COM     }
6067851SDana.Myers@Sun.COM 
6077851SDana.Myers@Sun.COM     Offset = (UINT32) OffsetDesc->Integer.Value;
6087851SDana.Myers@Sun.COM 
6097851SDana.Myers@Sun.COM     /*
6107851SDana.Myers@Sun.COM      * Setup the Bit offsets and counts, according to the opcode
6117851SDana.Myers@Sun.COM      */
6127851SDana.Myers@Sun.COM     switch (AmlOpcode)
6137851SDana.Myers@Sun.COM     {
6147851SDana.Myers@Sun.COM     case AML_CREATE_FIELD_OP:
6157851SDana.Myers@Sun.COM 
6167851SDana.Myers@Sun.COM         /* Offset is in bits, count is in bits */
6177851SDana.Myers@Sun.COM 
6187851SDana.Myers@Sun.COM         FieldFlags = AML_FIELD_ACCESS_BYTE;
6197851SDana.Myers@Sun.COM         BitOffset  = Offset;
6207851SDana.Myers@Sun.COM         BitCount   = (UINT32) LengthDesc->Integer.Value;
6217851SDana.Myers@Sun.COM 
6227851SDana.Myers@Sun.COM         /* Must have a valid (>0) bit count */
6237851SDana.Myers@Sun.COM 
6247851SDana.Myers@Sun.COM         if (BitCount == 0)
6257851SDana.Myers@Sun.COM         {
6267851SDana.Myers@Sun.COM             ACPI_ERROR ((AE_INFO,
6277851SDana.Myers@Sun.COM                 "Attempt to CreateField of length zero"));
6287851SDana.Myers@Sun.COM             Status = AE_AML_OPERAND_VALUE;
6297851SDana.Myers@Sun.COM             goto Cleanup;
6307851SDana.Myers@Sun.COM         }
6317851SDana.Myers@Sun.COM         break;
6327851SDana.Myers@Sun.COM 
6337851SDana.Myers@Sun.COM     case AML_CREATE_BIT_FIELD_OP:
6347851SDana.Myers@Sun.COM 
6357851SDana.Myers@Sun.COM         /* Offset is in bits, Field is one bit */
6367851SDana.Myers@Sun.COM 
6377851SDana.Myers@Sun.COM         BitOffset  = Offset;
6387851SDana.Myers@Sun.COM         BitCount   = 1;
6397851SDana.Myers@Sun.COM         FieldFlags = AML_FIELD_ACCESS_BYTE;
6407851SDana.Myers@Sun.COM         break;
6417851SDana.Myers@Sun.COM 
6427851SDana.Myers@Sun.COM     case AML_CREATE_BYTE_FIELD_OP:
6437851SDana.Myers@Sun.COM 
6447851SDana.Myers@Sun.COM         /* Offset is in bytes, field is one byte */
6457851SDana.Myers@Sun.COM 
6467851SDana.Myers@Sun.COM         BitOffset  = 8 * Offset;
6477851SDana.Myers@Sun.COM         BitCount   = 8;
6487851SDana.Myers@Sun.COM         FieldFlags = AML_FIELD_ACCESS_BYTE;
6497851SDana.Myers@Sun.COM         break;
6507851SDana.Myers@Sun.COM 
6517851SDana.Myers@Sun.COM     case AML_CREATE_WORD_FIELD_OP:
6527851SDana.Myers@Sun.COM 
6537851SDana.Myers@Sun.COM         /* Offset is in bytes, field is one word */
6547851SDana.Myers@Sun.COM 
6557851SDana.Myers@Sun.COM         BitOffset  = 8 * Offset;
6567851SDana.Myers@Sun.COM         BitCount   = 16;
6577851SDana.Myers@Sun.COM         FieldFlags = AML_FIELD_ACCESS_WORD;
6587851SDana.Myers@Sun.COM         break;
6597851SDana.Myers@Sun.COM 
6607851SDana.Myers@Sun.COM     case AML_CREATE_DWORD_FIELD_OP:
6617851SDana.Myers@Sun.COM 
6627851SDana.Myers@Sun.COM         /* Offset is in bytes, field is one dword */
6637851SDana.Myers@Sun.COM 
6647851SDana.Myers@Sun.COM         BitOffset  = 8 * Offset;
6657851SDana.Myers@Sun.COM         BitCount   = 32;
6667851SDana.Myers@Sun.COM         FieldFlags = AML_FIELD_ACCESS_DWORD;
6677851SDana.Myers@Sun.COM         break;
6687851SDana.Myers@Sun.COM 
6697851SDana.Myers@Sun.COM     case AML_CREATE_QWORD_FIELD_OP:
6707851SDana.Myers@Sun.COM 
6717851SDana.Myers@Sun.COM         /* Offset is in bytes, field is one qword */
6727851SDana.Myers@Sun.COM 
6737851SDana.Myers@Sun.COM         BitOffset  = 8 * Offset;
6747851SDana.Myers@Sun.COM         BitCount   = 64;
6757851SDana.Myers@Sun.COM         FieldFlags = AML_FIELD_ACCESS_QWORD;
6767851SDana.Myers@Sun.COM         break;
6777851SDana.Myers@Sun.COM 
6787851SDana.Myers@Sun.COM     default:
6797851SDana.Myers@Sun.COM 
6807851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO,
6817851SDana.Myers@Sun.COM             "Unknown field creation opcode %02x",
6827851SDana.Myers@Sun.COM             AmlOpcode));
6837851SDana.Myers@Sun.COM         Status = AE_AML_BAD_OPCODE;
6847851SDana.Myers@Sun.COM         goto Cleanup;
6857851SDana.Myers@Sun.COM     }
6867851SDana.Myers@Sun.COM 
6877851SDana.Myers@Sun.COM     /* Entire field must fit within the current length of the buffer */
6887851SDana.Myers@Sun.COM 
6897851SDana.Myers@Sun.COM     if ((BitOffset + BitCount) >
6907851SDana.Myers@Sun.COM         (8 * (UINT32) BufferDesc->Buffer.Length))
6917851SDana.Myers@Sun.COM     {
6927851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO,
6937851SDana.Myers@Sun.COM             "Field [%4.4s] at %d exceeds Buffer [%4.4s] size %d (bits)",
6947851SDana.Myers@Sun.COM             AcpiUtGetNodeName (ResultDesc),
6957851SDana.Myers@Sun.COM             BitOffset + BitCount,
6967851SDana.Myers@Sun.COM             AcpiUtGetNodeName (BufferDesc->Buffer.Node),
6977851SDana.Myers@Sun.COM             8 * (UINT32) BufferDesc->Buffer.Length));
6987851SDana.Myers@Sun.COM         Status = AE_AML_BUFFER_LIMIT;
6997851SDana.Myers@Sun.COM         goto Cleanup;
7007851SDana.Myers@Sun.COM     }
7017851SDana.Myers@Sun.COM 
7027851SDana.Myers@Sun.COM     /*
7037851SDana.Myers@Sun.COM      * Initialize areas of the field object that are common to all fields
7047851SDana.Myers@Sun.COM      * For FieldFlags, use LOCK_RULE = 0 (NO_LOCK),
7057851SDana.Myers@Sun.COM      * UPDATE_RULE = 0 (UPDATE_PRESERVE)
7067851SDana.Myers@Sun.COM      */
7077851SDana.Myers@Sun.COM     Status = AcpiExPrepCommonFieldObject (ObjDesc, FieldFlags, 0,
7087851SDana.Myers@Sun.COM                                             BitOffset, BitCount);
7097851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
7107851SDana.Myers@Sun.COM     {
7117851SDana.Myers@Sun.COM         goto Cleanup;
7127851SDana.Myers@Sun.COM     }
7137851SDana.Myers@Sun.COM 
7147851SDana.Myers@Sun.COM     ObjDesc->BufferField.BufferObj = BufferDesc;
7157851SDana.Myers@Sun.COM 
7167851SDana.Myers@Sun.COM     /* Reference count for BufferDesc inherits ObjDesc count */
7177851SDana.Myers@Sun.COM 
7187851SDana.Myers@Sun.COM     BufferDesc->Common.ReferenceCount = (UINT16)
7197851SDana.Myers@Sun.COM         (BufferDesc->Common.ReferenceCount + ObjDesc->Common.ReferenceCount);
7207851SDana.Myers@Sun.COM 
7217851SDana.Myers@Sun.COM 
7227851SDana.Myers@Sun.COM Cleanup:
7237851SDana.Myers@Sun.COM 
7247851SDana.Myers@Sun.COM     /* Always delete the operands */
7257851SDana.Myers@Sun.COM 
7267851SDana.Myers@Sun.COM     AcpiUtRemoveReference (OffsetDesc);
7277851SDana.Myers@Sun.COM     AcpiUtRemoveReference (BufferDesc);
7287851SDana.Myers@Sun.COM 
7297851SDana.Myers@Sun.COM     if (AmlOpcode == AML_CREATE_FIELD_OP)
7307851SDana.Myers@Sun.COM     {
7317851SDana.Myers@Sun.COM         AcpiUtRemoveReference (LengthDesc);
7327851SDana.Myers@Sun.COM     }
7337851SDana.Myers@Sun.COM 
7347851SDana.Myers@Sun.COM     /* On failure, delete the result descriptor */
7357851SDana.Myers@Sun.COM 
7367851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
7377851SDana.Myers@Sun.COM     {
7387851SDana.Myers@Sun.COM         AcpiUtRemoveReference (ResultDesc);     /* Result descriptor */
7397851SDana.Myers@Sun.COM     }
7407851SDana.Myers@Sun.COM     else
7417851SDana.Myers@Sun.COM     {
7427851SDana.Myers@Sun.COM         /* Now the address and length are valid for this BufferField */
7437851SDana.Myers@Sun.COM 
7447851SDana.Myers@Sun.COM         ObjDesc->BufferField.Flags |= AOPOBJ_DATA_VALID;
7457851SDana.Myers@Sun.COM     }
7467851SDana.Myers@Sun.COM 
7477851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
7487851SDana.Myers@Sun.COM }
7497851SDana.Myers@Sun.COM 
7507851SDana.Myers@Sun.COM 
7517851SDana.Myers@Sun.COM /*******************************************************************************
7527851SDana.Myers@Sun.COM  *
7537851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsEvalBufferFieldOperands
7547851SDana.Myers@Sun.COM  *
7557851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState       - Current walk
7567851SDana.Myers@Sun.COM  *              Op              - A valid BufferField Op object
7577851SDana.Myers@Sun.COM  *
7587851SDana.Myers@Sun.COM  * RETURN:      Status
7597851SDana.Myers@Sun.COM  *
7607851SDana.Myers@Sun.COM  * DESCRIPTION: Get BufferField Buffer and Index
7617851SDana.Myers@Sun.COM  *              Called from AcpiDsExecEndOp during BufferField parse tree walk
7627851SDana.Myers@Sun.COM  *
7637851SDana.Myers@Sun.COM  ******************************************************************************/
7647851SDana.Myers@Sun.COM 
7657851SDana.Myers@Sun.COM ACPI_STATUS
AcpiDsEvalBufferFieldOperands(ACPI_WALK_STATE * WalkState,ACPI_PARSE_OBJECT * Op)7667851SDana.Myers@Sun.COM AcpiDsEvalBufferFieldOperands (
7677851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState,
7687851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Op)
7697851SDana.Myers@Sun.COM {
7707851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
7717851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc;
7727851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *Node;
7737851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *NextOp;
7747851SDana.Myers@Sun.COM 
7757851SDana.Myers@Sun.COM 
7767851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_PTR (DsEvalBufferFieldOperands, Op);
7777851SDana.Myers@Sun.COM 
7787851SDana.Myers@Sun.COM 
7797851SDana.Myers@Sun.COM     /*
7807851SDana.Myers@Sun.COM      * This is where we evaluate the address and length fields of the
7817851SDana.Myers@Sun.COM      * CreateXxxField declaration
7827851SDana.Myers@Sun.COM      */
7837851SDana.Myers@Sun.COM     Node =  Op->Common.Node;
7847851SDana.Myers@Sun.COM 
7857851SDana.Myers@Sun.COM     /* NextOp points to the op that holds the Buffer */
7867851SDana.Myers@Sun.COM 
7877851SDana.Myers@Sun.COM     NextOp = Op->Common.Value.Arg;
7887851SDana.Myers@Sun.COM 
7897851SDana.Myers@Sun.COM     /* Evaluate/create the address and length operands */
7907851SDana.Myers@Sun.COM 
7917851SDana.Myers@Sun.COM     Status = AcpiDsCreateOperands (WalkState, NextOp);
7927851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
7937851SDana.Myers@Sun.COM     {
7947851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
7957851SDana.Myers@Sun.COM     }
7967851SDana.Myers@Sun.COM 
7977851SDana.Myers@Sun.COM     ObjDesc = AcpiNsGetAttachedObject (Node);
7987851SDana.Myers@Sun.COM     if (!ObjDesc)
7997851SDana.Myers@Sun.COM     {
8007851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_NOT_EXIST);
8017851SDana.Myers@Sun.COM     }
8027851SDana.Myers@Sun.COM 
8037851SDana.Myers@Sun.COM     /* Resolve the operands */
8047851SDana.Myers@Sun.COM 
8057851SDana.Myers@Sun.COM     Status = AcpiExResolveOperands (Op->Common.AmlOpcode,
8067851SDana.Myers@Sun.COM                     ACPI_WALK_OPERANDS, WalkState);
8077851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
8087851SDana.Myers@Sun.COM     {
8097851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "(%s) bad operand(s) (%X)",
8107851SDana.Myers@Sun.COM             AcpiPsGetOpcodeName (Op->Common.AmlOpcode), Status));
8117851SDana.Myers@Sun.COM 
8127851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
8137851SDana.Myers@Sun.COM     }
8147851SDana.Myers@Sun.COM 
8157851SDana.Myers@Sun.COM     /* Initialize the Buffer Field */
8167851SDana.Myers@Sun.COM 
8177851SDana.Myers@Sun.COM     if (Op->Common.AmlOpcode == AML_CREATE_FIELD_OP)
8187851SDana.Myers@Sun.COM     {
8197851SDana.Myers@Sun.COM         /* NOTE: Slightly different operands for this opcode */
8207851SDana.Myers@Sun.COM 
8217851SDana.Myers@Sun.COM         Status = AcpiDsInitBufferField (Op->Common.AmlOpcode, ObjDesc,
8227851SDana.Myers@Sun.COM                     WalkState->Operands[0], WalkState->Operands[1],
8237851SDana.Myers@Sun.COM                     WalkState->Operands[2], WalkState->Operands[3]);
8247851SDana.Myers@Sun.COM     }
8257851SDana.Myers@Sun.COM     else
8267851SDana.Myers@Sun.COM     {
8277851SDana.Myers@Sun.COM         /* All other, CreateXxxField opcodes */
8287851SDana.Myers@Sun.COM 
8297851SDana.Myers@Sun.COM         Status = AcpiDsInitBufferField (Op->Common.AmlOpcode, ObjDesc,
8307851SDana.Myers@Sun.COM                     WalkState->Operands[0], WalkState->Operands[1],
8317851SDana.Myers@Sun.COM                                       NULL, WalkState->Operands[2]);
8327851SDana.Myers@Sun.COM     }
8337851SDana.Myers@Sun.COM 
8347851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
8357851SDana.Myers@Sun.COM }
8367851SDana.Myers@Sun.COM 
8377851SDana.Myers@Sun.COM 
8387851SDana.Myers@Sun.COM /*******************************************************************************
8397851SDana.Myers@Sun.COM  *
8407851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsEvalRegionOperands
8417851SDana.Myers@Sun.COM  *
8427851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState       - Current walk
8437851SDana.Myers@Sun.COM  *              Op              - A valid region Op object
8447851SDana.Myers@Sun.COM  *
8457851SDana.Myers@Sun.COM  * RETURN:      Status
8467851SDana.Myers@Sun.COM  *
8477851SDana.Myers@Sun.COM  * DESCRIPTION: Get region address and length
8487851SDana.Myers@Sun.COM  *              Called from AcpiDsExecEndOp during OpRegion parse tree walk
8497851SDana.Myers@Sun.COM  *
8507851SDana.Myers@Sun.COM  ******************************************************************************/
8517851SDana.Myers@Sun.COM 
8527851SDana.Myers@Sun.COM ACPI_STATUS
AcpiDsEvalRegionOperands(ACPI_WALK_STATE * WalkState,ACPI_PARSE_OBJECT * Op)8537851SDana.Myers@Sun.COM AcpiDsEvalRegionOperands (
8547851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState,
8557851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Op)
8567851SDana.Myers@Sun.COM {
8577851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
8587851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc;
8597851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *OperandDesc;
8607851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *Node;
8617851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *NextOp;
8627851SDana.Myers@Sun.COM 
8637851SDana.Myers@Sun.COM 
8647851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_PTR (DsEvalRegionOperands, Op);
8657851SDana.Myers@Sun.COM 
8667851SDana.Myers@Sun.COM 
8677851SDana.Myers@Sun.COM     /*
8687851SDana.Myers@Sun.COM      * This is where we evaluate the address and length fields of the
8697851SDana.Myers@Sun.COM      * OpRegion declaration
8707851SDana.Myers@Sun.COM      */
8717851SDana.Myers@Sun.COM     Node =  Op->Common.Node;
8727851SDana.Myers@Sun.COM 
8737851SDana.Myers@Sun.COM     /* NextOp points to the op that holds the SpaceID */
8747851SDana.Myers@Sun.COM 
8757851SDana.Myers@Sun.COM     NextOp = Op->Common.Value.Arg;
8767851SDana.Myers@Sun.COM 
8777851SDana.Myers@Sun.COM     /* NextOp points to address op */
8787851SDana.Myers@Sun.COM 
8797851SDana.Myers@Sun.COM     NextOp = NextOp->Common.Next;
8807851SDana.Myers@Sun.COM 
8817851SDana.Myers@Sun.COM     /* Evaluate/create the address and length operands */
8827851SDana.Myers@Sun.COM 
8837851SDana.Myers@Sun.COM     Status = AcpiDsCreateOperands (WalkState, NextOp);
8847851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
8857851SDana.Myers@Sun.COM     {
8867851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
8877851SDana.Myers@Sun.COM     }
8887851SDana.Myers@Sun.COM 
8897851SDana.Myers@Sun.COM     /* Resolve the length and address operands to numbers */
8907851SDana.Myers@Sun.COM 
8917851SDana.Myers@Sun.COM     Status = AcpiExResolveOperands (Op->Common.AmlOpcode,
8927851SDana.Myers@Sun.COM                 ACPI_WALK_OPERANDS, WalkState);
8937851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
8947851SDana.Myers@Sun.COM     {
8957851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
8967851SDana.Myers@Sun.COM     }
8977851SDana.Myers@Sun.COM 
8987851SDana.Myers@Sun.COM     ObjDesc = AcpiNsGetAttachedObject (Node);
8997851SDana.Myers@Sun.COM     if (!ObjDesc)
9007851SDana.Myers@Sun.COM     {
9017851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_NOT_EXIST);
9027851SDana.Myers@Sun.COM     }
9037851SDana.Myers@Sun.COM 
9047851SDana.Myers@Sun.COM     /*
9057851SDana.Myers@Sun.COM      * Get the length operand and save it
9067851SDana.Myers@Sun.COM      * (at Top of stack)
9077851SDana.Myers@Sun.COM      */
9087851SDana.Myers@Sun.COM     OperandDesc = WalkState->Operands[WalkState->NumOperands - 1];
9097851SDana.Myers@Sun.COM 
9107851SDana.Myers@Sun.COM     ObjDesc->Region.Length = (UINT32) OperandDesc->Integer.Value;
9117851SDana.Myers@Sun.COM     AcpiUtRemoveReference (OperandDesc);
9127851SDana.Myers@Sun.COM 
9137851SDana.Myers@Sun.COM     /*
9147851SDana.Myers@Sun.COM      * Get the address and save it
9157851SDana.Myers@Sun.COM      * (at top of stack - 1)
9167851SDana.Myers@Sun.COM      */
9177851SDana.Myers@Sun.COM     OperandDesc = WalkState->Operands[WalkState->NumOperands - 2];
9187851SDana.Myers@Sun.COM 
9197851SDana.Myers@Sun.COM     ObjDesc->Region.Address = (ACPI_PHYSICAL_ADDRESS)
9207851SDana.Myers@Sun.COM                                 OperandDesc->Integer.Value;
9217851SDana.Myers@Sun.COM     AcpiUtRemoveReference (OperandDesc);
9227851SDana.Myers@Sun.COM 
9237851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n",
9247851SDana.Myers@Sun.COM         ObjDesc,
9257851SDana.Myers@Sun.COM         ACPI_FORMAT_NATIVE_UINT (ObjDesc->Region.Address),
9267851SDana.Myers@Sun.COM         ObjDesc->Region.Length));
9277851SDana.Myers@Sun.COM 
9287851SDana.Myers@Sun.COM     /* Now the address and length are valid for this opregion */
9297851SDana.Myers@Sun.COM 
9307851SDana.Myers@Sun.COM     ObjDesc->Region.Flags |= AOPOBJ_DATA_VALID;
9317851SDana.Myers@Sun.COM 
9327851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
9337851SDana.Myers@Sun.COM }
9347851SDana.Myers@Sun.COM 
9357851SDana.Myers@Sun.COM 
9367851SDana.Myers@Sun.COM /*******************************************************************************
9377851SDana.Myers@Sun.COM  *
9387851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsEvalTableRegionOperands
9397851SDana.Myers@Sun.COM  *
9407851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState       - Current walk
9417851SDana.Myers@Sun.COM  *              Op              - A valid region Op object
9427851SDana.Myers@Sun.COM  *
9437851SDana.Myers@Sun.COM  * RETURN:      Status
9447851SDana.Myers@Sun.COM  *
9457851SDana.Myers@Sun.COM  * DESCRIPTION: Get region address and length
9467851SDana.Myers@Sun.COM  *              Called from AcpiDsExecEndOp during DataTableRegion parse tree walk
9477851SDana.Myers@Sun.COM  *
9487851SDana.Myers@Sun.COM  ******************************************************************************/
9497851SDana.Myers@Sun.COM 
9507851SDana.Myers@Sun.COM ACPI_STATUS
AcpiDsEvalTableRegionOperands(ACPI_WALK_STATE * WalkState,ACPI_PARSE_OBJECT * Op)9517851SDana.Myers@Sun.COM AcpiDsEvalTableRegionOperands (
9527851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState,
9537851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Op)
9547851SDana.Myers@Sun.COM {
9557851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
9567851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc;
9577851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     **Operand;
9587851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *Node;
9597851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *NextOp;
9607851SDana.Myers@Sun.COM     UINT32                  TableIndex;
9617851SDana.Myers@Sun.COM     ACPI_TABLE_HEADER       *Table;
9627851SDana.Myers@Sun.COM 
9637851SDana.Myers@Sun.COM 
9647851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_PTR (DsEvalTableRegionOperands, Op);
9657851SDana.Myers@Sun.COM 
9667851SDana.Myers@Sun.COM 
9677851SDana.Myers@Sun.COM     /*
9687851SDana.Myers@Sun.COM      * This is where we evaluate the SignatureString and OemIDString
9697851SDana.Myers@Sun.COM      * and OemTableIDString of the DataTableRegion declaration
9707851SDana.Myers@Sun.COM      */
9717851SDana.Myers@Sun.COM     Node =  Op->Common.Node;
9727851SDana.Myers@Sun.COM 
9737851SDana.Myers@Sun.COM     /* NextOp points to SignatureString op */
9747851SDana.Myers@Sun.COM 
9757851SDana.Myers@Sun.COM     NextOp = Op->Common.Value.Arg;
9767851SDana.Myers@Sun.COM 
9777851SDana.Myers@Sun.COM     /*
9787851SDana.Myers@Sun.COM      * Evaluate/create the SignatureString and OemIDString
9797851SDana.Myers@Sun.COM      * and OemTableIDString operands
9807851SDana.Myers@Sun.COM      */
9817851SDana.Myers@Sun.COM     Status = AcpiDsCreateOperands (WalkState, NextOp);
9827851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
9837851SDana.Myers@Sun.COM     {
9847851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
9857851SDana.Myers@Sun.COM     }
9867851SDana.Myers@Sun.COM 
9877851SDana.Myers@Sun.COM     /*
9887851SDana.Myers@Sun.COM      * Resolve the SignatureString and OemIDString
9897851SDana.Myers@Sun.COM      * and OemTableIDString operands
9907851SDana.Myers@Sun.COM      */
9917851SDana.Myers@Sun.COM     Status = AcpiExResolveOperands (Op->Common.AmlOpcode,
9927851SDana.Myers@Sun.COM                 ACPI_WALK_OPERANDS, WalkState);
9937851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
9947851SDana.Myers@Sun.COM     {
9957851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
9967851SDana.Myers@Sun.COM     }
9977851SDana.Myers@Sun.COM 
9987851SDana.Myers@Sun.COM     Operand = &WalkState->Operands[0];
9997851SDana.Myers@Sun.COM 
10007851SDana.Myers@Sun.COM     /* Find the ACPI table */
10017851SDana.Myers@Sun.COM 
10027851SDana.Myers@Sun.COM     Status = AcpiTbFindTable (Operand[0]->String.Pointer,
10037851SDana.Myers@Sun.COM                 Operand[1]->String.Pointer, Operand[2]->String.Pointer,
10047851SDana.Myers@Sun.COM                 &TableIndex);
10057851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
10067851SDana.Myers@Sun.COM     {
10077851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
10087851SDana.Myers@Sun.COM     }
10097851SDana.Myers@Sun.COM 
10107851SDana.Myers@Sun.COM     AcpiUtRemoveReference (Operand[0]);
10117851SDana.Myers@Sun.COM     AcpiUtRemoveReference (Operand[1]);
10127851SDana.Myers@Sun.COM     AcpiUtRemoveReference (Operand[2]);
10137851SDana.Myers@Sun.COM 
10147851SDana.Myers@Sun.COM     Status = AcpiGetTableByIndex (TableIndex, &Table);
10157851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
10167851SDana.Myers@Sun.COM     {
10177851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
10187851SDana.Myers@Sun.COM     }
10197851SDana.Myers@Sun.COM 
10207851SDana.Myers@Sun.COM     ObjDesc = AcpiNsGetAttachedObject (Node);
10217851SDana.Myers@Sun.COM     if (!ObjDesc)
10227851SDana.Myers@Sun.COM     {
10237851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_NOT_EXIST);
10247851SDana.Myers@Sun.COM     }
10257851SDana.Myers@Sun.COM 
10267851SDana.Myers@Sun.COM     ObjDesc->Region.Address = (ACPI_PHYSICAL_ADDRESS) ACPI_TO_INTEGER (Table);
10277851SDana.Myers@Sun.COM     ObjDesc->Region.Length = Table->Length;
10287851SDana.Myers@Sun.COM 
10297851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n",
10307851SDana.Myers@Sun.COM         ObjDesc,
10317851SDana.Myers@Sun.COM         ACPI_FORMAT_NATIVE_UINT (ObjDesc->Region.Address),
10327851SDana.Myers@Sun.COM         ObjDesc->Region.Length));
10337851SDana.Myers@Sun.COM 
10347851SDana.Myers@Sun.COM     /* Now the address and length are valid for this opregion */
10357851SDana.Myers@Sun.COM 
10367851SDana.Myers@Sun.COM     ObjDesc->Region.Flags |= AOPOBJ_DATA_VALID;
10377851SDana.Myers@Sun.COM 
10387851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
10397851SDana.Myers@Sun.COM }
10407851SDana.Myers@Sun.COM 
10417851SDana.Myers@Sun.COM 
10427851SDana.Myers@Sun.COM /*******************************************************************************
10437851SDana.Myers@Sun.COM  *
10447851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsEvalDataObjectOperands
10457851SDana.Myers@Sun.COM  *
10467851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState       - Current walk
10477851SDana.Myers@Sun.COM  *              Op              - A valid DataObject Op object
10487851SDana.Myers@Sun.COM  *              ObjDesc         - DataObject
10497851SDana.Myers@Sun.COM  *
10507851SDana.Myers@Sun.COM  * RETURN:      Status
10517851SDana.Myers@Sun.COM  *
10527851SDana.Myers@Sun.COM  * DESCRIPTION: Get the operands and complete the following data object types:
10537851SDana.Myers@Sun.COM  *              Buffer, Package.
10547851SDana.Myers@Sun.COM  *
10557851SDana.Myers@Sun.COM  ******************************************************************************/
10567851SDana.Myers@Sun.COM 
10577851SDana.Myers@Sun.COM ACPI_STATUS
AcpiDsEvalDataObjectOperands(ACPI_WALK_STATE * WalkState,ACPI_PARSE_OBJECT * Op,ACPI_OPERAND_OBJECT * ObjDesc)10587851SDana.Myers@Sun.COM AcpiDsEvalDataObjectOperands (
10597851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState,
10607851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Op,
10617851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc)
10627851SDana.Myers@Sun.COM {
10637851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
10647851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ArgDesc;
10657851SDana.Myers@Sun.COM     UINT32                  Length;
10667851SDana.Myers@Sun.COM 
10677851SDana.Myers@Sun.COM 
10687851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE (DsEvalDataObjectOperands);
10697851SDana.Myers@Sun.COM 
10707851SDana.Myers@Sun.COM 
10717851SDana.Myers@Sun.COM     /* The first operand (for all of these data objects) is the length */
10727851SDana.Myers@Sun.COM 
10737851SDana.Myers@Sun.COM     /*
10747851SDana.Myers@Sun.COM      * Set proper index into operand stack for AcpiDsObjStackPush
10757851SDana.Myers@Sun.COM      * invoked inside AcpiDsCreateOperand.
10767851SDana.Myers@Sun.COM      */
10777851SDana.Myers@Sun.COM     WalkState->OperandIndex = WalkState->NumOperands;
10787851SDana.Myers@Sun.COM 
10797851SDana.Myers@Sun.COM     Status = AcpiDsCreateOperand (WalkState, Op->Common.Value.Arg, 1);
10807851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
10817851SDana.Myers@Sun.COM     {
10827851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
10837851SDana.Myers@Sun.COM     }
10847851SDana.Myers@Sun.COM 
10857851SDana.Myers@Sun.COM     Status = AcpiExResolveOperands (WalkState->Opcode,
10867851SDana.Myers@Sun.COM                     &(WalkState->Operands [WalkState->NumOperands -1]),
10877851SDana.Myers@Sun.COM                     WalkState);
10887851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
10897851SDana.Myers@Sun.COM     {
10907851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
10917851SDana.Myers@Sun.COM     }
10927851SDana.Myers@Sun.COM 
10937851SDana.Myers@Sun.COM     /* Extract length operand */
10947851SDana.Myers@Sun.COM 
10957851SDana.Myers@Sun.COM     ArgDesc = WalkState->Operands [WalkState->NumOperands - 1];
10967851SDana.Myers@Sun.COM     Length = (UINT32) ArgDesc->Integer.Value;
10977851SDana.Myers@Sun.COM 
10987851SDana.Myers@Sun.COM     /* Cleanup for length operand */
10997851SDana.Myers@Sun.COM 
11007851SDana.Myers@Sun.COM     Status = AcpiDsObjStackPop (1, WalkState);
11017851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
11027851SDana.Myers@Sun.COM     {
11037851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
11047851SDana.Myers@Sun.COM     }
11057851SDana.Myers@Sun.COM 
11067851SDana.Myers@Sun.COM     AcpiUtRemoveReference (ArgDesc);
11077851SDana.Myers@Sun.COM 
11087851SDana.Myers@Sun.COM     /*
11097851SDana.Myers@Sun.COM      * Create the actual data object
11107851SDana.Myers@Sun.COM      */
11117851SDana.Myers@Sun.COM     switch (Op->Common.AmlOpcode)
11127851SDana.Myers@Sun.COM     {
11137851SDana.Myers@Sun.COM     case AML_BUFFER_OP:
11147851SDana.Myers@Sun.COM 
11157851SDana.Myers@Sun.COM         Status = AcpiDsBuildInternalBufferObj (WalkState, Op, Length, &ObjDesc);
11167851SDana.Myers@Sun.COM         break;
11177851SDana.Myers@Sun.COM 
11187851SDana.Myers@Sun.COM     case AML_PACKAGE_OP:
11197851SDana.Myers@Sun.COM     case AML_VAR_PACKAGE_OP:
11207851SDana.Myers@Sun.COM 
11217851SDana.Myers@Sun.COM         Status = AcpiDsBuildInternalPackageObj (WalkState, Op, Length, &ObjDesc);
11227851SDana.Myers@Sun.COM         break;
11237851SDana.Myers@Sun.COM 
11247851SDana.Myers@Sun.COM     default:
11257851SDana.Myers@Sun.COM         return_ACPI_STATUS (AE_AML_BAD_OPCODE);
11267851SDana.Myers@Sun.COM     }
11277851SDana.Myers@Sun.COM 
11287851SDana.Myers@Sun.COM     if (ACPI_SUCCESS (Status))
11297851SDana.Myers@Sun.COM     {
11307851SDana.Myers@Sun.COM         /*
11317851SDana.Myers@Sun.COM          * Return the object in the WalkState, unless the parent is a package -
11327851SDana.Myers@Sun.COM          * in this case, the return object will be stored in the parse tree
11337851SDana.Myers@Sun.COM          * for the package.
11347851SDana.Myers@Sun.COM          */
11357851SDana.Myers@Sun.COM         if ((!Op->Common.Parent) ||
11367851SDana.Myers@Sun.COM             ((Op->Common.Parent->Common.AmlOpcode != AML_PACKAGE_OP) &&
11377851SDana.Myers@Sun.COM              (Op->Common.Parent->Common.AmlOpcode != AML_VAR_PACKAGE_OP) &&
11387851SDana.Myers@Sun.COM              (Op->Common.Parent->Common.AmlOpcode != AML_NAME_OP)))
11397851SDana.Myers@Sun.COM         {
11407851SDana.Myers@Sun.COM             WalkState->ResultObj = ObjDesc;
11417851SDana.Myers@Sun.COM         }
11427851SDana.Myers@Sun.COM     }
11437851SDana.Myers@Sun.COM 
11447851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
11457851SDana.Myers@Sun.COM }
11467851SDana.Myers@Sun.COM 
11477851SDana.Myers@Sun.COM 
11487851SDana.Myers@Sun.COM /*******************************************************************************
11497851SDana.Myers@Sun.COM  *
11507851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsEvalBankFieldOperands
11517851SDana.Myers@Sun.COM  *
11527851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState       - Current walk
11537851SDana.Myers@Sun.COM  *              Op              - A valid BankField Op object
11547851SDana.Myers@Sun.COM  *
11557851SDana.Myers@Sun.COM  * RETURN:      Status
11567851SDana.Myers@Sun.COM  *
11577851SDana.Myers@Sun.COM  * DESCRIPTION: Get BankField BankValue
11587851SDana.Myers@Sun.COM  *              Called from AcpiDsExecEndOp during BankField parse tree walk
11597851SDana.Myers@Sun.COM  *
11607851SDana.Myers@Sun.COM  ******************************************************************************/
11617851SDana.Myers@Sun.COM 
11627851SDana.Myers@Sun.COM ACPI_STATUS
AcpiDsEvalBankFieldOperands(ACPI_WALK_STATE * WalkState,ACPI_PARSE_OBJECT * Op)11637851SDana.Myers@Sun.COM AcpiDsEvalBankFieldOperands (
11647851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState,
11657851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Op)
11667851SDana.Myers@Sun.COM {
11677851SDana.Myers@Sun.COM     ACPI_STATUS             Status;
11687851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ObjDesc;
11697851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *OperandDesc;
11707851SDana.Myers@Sun.COM     ACPI_NAMESPACE_NODE     *Node;
11717851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *NextOp;
11727851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Arg;
11737851SDana.Myers@Sun.COM 
11747851SDana.Myers@Sun.COM 
11757851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_PTR (DsEvalBankFieldOperands, Op);
11767851SDana.Myers@Sun.COM 
11777851SDana.Myers@Sun.COM 
11787851SDana.Myers@Sun.COM     /*
11797851SDana.Myers@Sun.COM      * This is where we evaluate the BankValue field of the
11807851SDana.Myers@Sun.COM      * BankField declaration
11817851SDana.Myers@Sun.COM      */
11827851SDana.Myers@Sun.COM 
11837851SDana.Myers@Sun.COM     /* NextOp points to the op that holds the Region */
11847851SDana.Myers@Sun.COM 
11857851SDana.Myers@Sun.COM     NextOp = Op->Common.Value.Arg;
11867851SDana.Myers@Sun.COM 
11877851SDana.Myers@Sun.COM     /* NextOp points to the op that holds the Bank Register */
11887851SDana.Myers@Sun.COM 
11897851SDana.Myers@Sun.COM     NextOp = NextOp->Common.Next;
11907851SDana.Myers@Sun.COM 
11917851SDana.Myers@Sun.COM     /* NextOp points to the op that holds the Bank Value */
11927851SDana.Myers@Sun.COM 
11937851SDana.Myers@Sun.COM     NextOp = NextOp->Common.Next;
11947851SDana.Myers@Sun.COM 
11957851SDana.Myers@Sun.COM     /*
11967851SDana.Myers@Sun.COM      * Set proper index into operand stack for AcpiDsObjStackPush
11977851SDana.Myers@Sun.COM      * invoked inside AcpiDsCreateOperand.
11987851SDana.Myers@Sun.COM      *
11997851SDana.Myers@Sun.COM      * We use WalkState->Operands[0] to store the evaluated BankValue
12007851SDana.Myers@Sun.COM      */
12017851SDana.Myers@Sun.COM     WalkState->OperandIndex = 0;
12027851SDana.Myers@Sun.COM 
12037851SDana.Myers@Sun.COM     Status = AcpiDsCreateOperand (WalkState, NextOp, 0);
12047851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
12057851SDana.Myers@Sun.COM     {
12067851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
12077851SDana.Myers@Sun.COM     }
12087851SDana.Myers@Sun.COM 
12097851SDana.Myers@Sun.COM     Status = AcpiExResolveToValue (&WalkState->Operands[0], WalkState);
12107851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
12117851SDana.Myers@Sun.COM     {
12127851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
12137851SDana.Myers@Sun.COM     }
12147851SDana.Myers@Sun.COM 
12157851SDana.Myers@Sun.COM     ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS,
12167851SDana.Myers@Sun.COM         AcpiPsGetOpcodeName (Op->Common.AmlOpcode), 1);
12177851SDana.Myers@Sun.COM     /*
12187851SDana.Myers@Sun.COM      * Get the BankValue operand and save it
12197851SDana.Myers@Sun.COM      * (at Top of stack)
12207851SDana.Myers@Sun.COM      */
12217851SDana.Myers@Sun.COM     OperandDesc = WalkState->Operands[0];
12227851SDana.Myers@Sun.COM 
12237851SDana.Myers@Sun.COM     /* Arg points to the start Bank Field */
12247851SDana.Myers@Sun.COM 
12257851SDana.Myers@Sun.COM     Arg = AcpiPsGetArg (Op, 4);
12267851SDana.Myers@Sun.COM     while (Arg)
12277851SDana.Myers@Sun.COM     {
12287851SDana.Myers@Sun.COM         /* Ignore OFFSET and ACCESSAS terms here */
12297851SDana.Myers@Sun.COM 
12307851SDana.Myers@Sun.COM         if (Arg->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP)
12317851SDana.Myers@Sun.COM         {
12327851SDana.Myers@Sun.COM             Node = Arg->Common.Node;
12337851SDana.Myers@Sun.COM 
12347851SDana.Myers@Sun.COM             ObjDesc = AcpiNsGetAttachedObject (Node);
12357851SDana.Myers@Sun.COM             if (!ObjDesc)
12367851SDana.Myers@Sun.COM             {
12377851SDana.Myers@Sun.COM                 return_ACPI_STATUS (AE_NOT_EXIST);
12387851SDana.Myers@Sun.COM             }
12397851SDana.Myers@Sun.COM 
12407851SDana.Myers@Sun.COM             ObjDesc->BankField.Value = (UINT32) OperandDesc->Integer.Value;
12417851SDana.Myers@Sun.COM         }
12427851SDana.Myers@Sun.COM 
12437851SDana.Myers@Sun.COM         /* Move to next field in the list */
12447851SDana.Myers@Sun.COM 
12457851SDana.Myers@Sun.COM         Arg = Arg->Common.Next;
12467851SDana.Myers@Sun.COM     }
12477851SDana.Myers@Sun.COM 
12487851SDana.Myers@Sun.COM     AcpiUtRemoveReference (OperandDesc);
12497851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
12507851SDana.Myers@Sun.COM }
12517851SDana.Myers@Sun.COM 
12527851SDana.Myers@Sun.COM 
12537851SDana.Myers@Sun.COM /*******************************************************************************
12547851SDana.Myers@Sun.COM  *
12557851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsExecBeginControlOp
12567851SDana.Myers@Sun.COM  *
12577851SDana.Myers@Sun.COM  * PARAMETERS:  WalkList        - The list that owns the walk stack
12587851SDana.Myers@Sun.COM  *              Op              - The control Op
12597851SDana.Myers@Sun.COM  *
12607851SDana.Myers@Sun.COM  * RETURN:      Status
12617851SDana.Myers@Sun.COM  *
12627851SDana.Myers@Sun.COM  * DESCRIPTION: Handles all control ops encountered during control method
12637851SDana.Myers@Sun.COM  *              execution.
12647851SDana.Myers@Sun.COM  *
12657851SDana.Myers@Sun.COM  ******************************************************************************/
12667851SDana.Myers@Sun.COM 
12677851SDana.Myers@Sun.COM ACPI_STATUS
AcpiDsExecBeginControlOp(ACPI_WALK_STATE * WalkState,ACPI_PARSE_OBJECT * Op)12687851SDana.Myers@Sun.COM AcpiDsExecBeginControlOp (
12697851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState,
12707851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Op)
12717851SDana.Myers@Sun.COM {
12727851SDana.Myers@Sun.COM     ACPI_STATUS             Status = AE_OK;
12737851SDana.Myers@Sun.COM     ACPI_GENERIC_STATE      *ControlState;
12747851SDana.Myers@Sun.COM 
12757851SDana.Myers@Sun.COM 
12767851SDana.Myers@Sun.COM     ACPI_FUNCTION_NAME (DsExecBeginControlOp);
12777851SDana.Myers@Sun.COM 
12787851SDana.Myers@Sun.COM 
12797851SDana.Myers@Sun.COM     ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p Opcode=%2.2X State=%p\n", Op,
12807851SDana.Myers@Sun.COM         Op->Common.AmlOpcode, WalkState));
12817851SDana.Myers@Sun.COM 
12827851SDana.Myers@Sun.COM     switch (Op->Common.AmlOpcode)
12837851SDana.Myers@Sun.COM     {
1284*9980SDana.Myers@Sun.COM     case AML_WHILE_OP:
1285*9980SDana.Myers@Sun.COM 
1286*9980SDana.Myers@Sun.COM         /*
1287*9980SDana.Myers@Sun.COM          * If this is an additional iteration of a while loop, continue.
1288*9980SDana.Myers@Sun.COM          * There is no need to allocate a new control state.
1289*9980SDana.Myers@Sun.COM          */
1290*9980SDana.Myers@Sun.COM         if (WalkState->ControlState)
1291*9980SDana.Myers@Sun.COM         {
1292*9980SDana.Myers@Sun.COM             if (WalkState->ControlState->Control.AmlPredicateStart ==
1293*9980SDana.Myers@Sun.COM                 (WalkState->ParserState.Aml - 1))
1294*9980SDana.Myers@Sun.COM             {
1295*9980SDana.Myers@Sun.COM                 /* Reset the state to start-of-loop */
1296*9980SDana.Myers@Sun.COM 
1297*9980SDana.Myers@Sun.COM                 WalkState->ControlState->Common.State = ACPI_CONTROL_CONDITIONAL_EXECUTING;
1298*9980SDana.Myers@Sun.COM                 break;
1299*9980SDana.Myers@Sun.COM             }
1300*9980SDana.Myers@Sun.COM         }
1301*9980SDana.Myers@Sun.COM 
1302*9980SDana.Myers@Sun.COM         /*lint -fallthrough */
1303*9980SDana.Myers@Sun.COM 
13047851SDana.Myers@Sun.COM     case AML_IF_OP:
13057851SDana.Myers@Sun.COM 
13067851SDana.Myers@Sun.COM         /*
13077851SDana.Myers@Sun.COM          * IF/WHILE: Create a new control state to manage these
13087851SDana.Myers@Sun.COM          * constructs. We need to manage these as a stack, in order
13097851SDana.Myers@Sun.COM          * to handle nesting.
13107851SDana.Myers@Sun.COM          */
13117851SDana.Myers@Sun.COM         ControlState = AcpiUtCreateControlState ();
13127851SDana.Myers@Sun.COM         if (!ControlState)
13137851SDana.Myers@Sun.COM         {
13147851SDana.Myers@Sun.COM             Status = AE_NO_MEMORY;
13157851SDana.Myers@Sun.COM             break;
13167851SDana.Myers@Sun.COM         }
13177851SDana.Myers@Sun.COM         /*
13187851SDana.Myers@Sun.COM          * Save a pointer to the predicate for multiple executions
13197851SDana.Myers@Sun.COM          * of a loop
13207851SDana.Myers@Sun.COM          */
13217851SDana.Myers@Sun.COM         ControlState->Control.AmlPredicateStart = WalkState->ParserState.Aml - 1;
13227851SDana.Myers@Sun.COM         ControlState->Control.PackageEnd = WalkState->ParserState.PkgEnd;
13237851SDana.Myers@Sun.COM         ControlState->Control.Opcode = Op->Common.AmlOpcode;
13247851SDana.Myers@Sun.COM 
13257851SDana.Myers@Sun.COM 
13267851SDana.Myers@Sun.COM         /* Push the control state on this walk's control stack */
13277851SDana.Myers@Sun.COM 
13287851SDana.Myers@Sun.COM         AcpiUtPushGenericState (&WalkState->ControlState, ControlState);
13297851SDana.Myers@Sun.COM         break;
13307851SDana.Myers@Sun.COM 
13317851SDana.Myers@Sun.COM     case AML_ELSE_OP:
13327851SDana.Myers@Sun.COM 
13337851SDana.Myers@Sun.COM         /* Predicate is in the state object */
13347851SDana.Myers@Sun.COM         /* If predicate is true, the IF was executed, ignore ELSE part */
13357851SDana.Myers@Sun.COM 
13367851SDana.Myers@Sun.COM         if (WalkState->LastPredicate)
13377851SDana.Myers@Sun.COM         {
13387851SDana.Myers@Sun.COM             Status = AE_CTRL_TRUE;
13397851SDana.Myers@Sun.COM         }
13407851SDana.Myers@Sun.COM 
13417851SDana.Myers@Sun.COM         break;
13427851SDana.Myers@Sun.COM 
13437851SDana.Myers@Sun.COM     case AML_RETURN_OP:
13447851SDana.Myers@Sun.COM 
13457851SDana.Myers@Sun.COM         break;
13467851SDana.Myers@Sun.COM 
13477851SDana.Myers@Sun.COM     default:
13487851SDana.Myers@Sun.COM         break;
13497851SDana.Myers@Sun.COM     }
13507851SDana.Myers@Sun.COM 
13517851SDana.Myers@Sun.COM     return (Status);
13527851SDana.Myers@Sun.COM }
13537851SDana.Myers@Sun.COM 
13547851SDana.Myers@Sun.COM 
13557851SDana.Myers@Sun.COM /*******************************************************************************
13567851SDana.Myers@Sun.COM  *
13577851SDana.Myers@Sun.COM  * FUNCTION:    AcpiDsExecEndControlOp
13587851SDana.Myers@Sun.COM  *
13597851SDana.Myers@Sun.COM  * PARAMETERS:  WalkList        - The list that owns the walk stack
13607851SDana.Myers@Sun.COM  *              Op              - The control Op
13617851SDana.Myers@Sun.COM  *
13627851SDana.Myers@Sun.COM  * RETURN:      Status
13637851SDana.Myers@Sun.COM  *
13647851SDana.Myers@Sun.COM  * DESCRIPTION: Handles all control ops encountered during control method
13657851SDana.Myers@Sun.COM  *              execution.
13667851SDana.Myers@Sun.COM  *
13677851SDana.Myers@Sun.COM  ******************************************************************************/
13687851SDana.Myers@Sun.COM 
13697851SDana.Myers@Sun.COM ACPI_STATUS
AcpiDsExecEndControlOp(ACPI_WALK_STATE * WalkState,ACPI_PARSE_OBJECT * Op)13707851SDana.Myers@Sun.COM AcpiDsExecEndControlOp (
13717851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState,
13727851SDana.Myers@Sun.COM     ACPI_PARSE_OBJECT       *Op)
13737851SDana.Myers@Sun.COM {
13747851SDana.Myers@Sun.COM     ACPI_STATUS             Status = AE_OK;
13757851SDana.Myers@Sun.COM     ACPI_GENERIC_STATE      *ControlState;
13767851SDana.Myers@Sun.COM 
13777851SDana.Myers@Sun.COM 
13787851SDana.Myers@Sun.COM     ACPI_FUNCTION_NAME (DsExecEndControlOp);
13797851SDana.Myers@Sun.COM 
13807851SDana.Myers@Sun.COM 
13817851SDana.Myers@Sun.COM     switch (Op->Common.AmlOpcode)
13827851SDana.Myers@Sun.COM     {
13837851SDana.Myers@Sun.COM     case AML_IF_OP:
13847851SDana.Myers@Sun.COM 
13857851SDana.Myers@Sun.COM         ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[IF_OP] Op=%p\n", Op));
13867851SDana.Myers@Sun.COM 
13877851SDana.Myers@Sun.COM         /*
13887851SDana.Myers@Sun.COM          * Save the result of the predicate in case there is an
13897851SDana.Myers@Sun.COM          * ELSE to come
13907851SDana.Myers@Sun.COM          */
13917851SDana.Myers@Sun.COM         WalkState->LastPredicate =
13927851SDana.Myers@Sun.COM             (BOOLEAN) WalkState->ControlState->Common.Value;
13937851SDana.Myers@Sun.COM 
13947851SDana.Myers@Sun.COM         /*
13957851SDana.Myers@Sun.COM          * Pop the control state that was created at the start
13967851SDana.Myers@Sun.COM          * of the IF and free it
13977851SDana.Myers@Sun.COM          */
13987851SDana.Myers@Sun.COM         ControlState = AcpiUtPopGenericState (&WalkState->ControlState);
13997851SDana.Myers@Sun.COM         AcpiUtDeleteGenericState (ControlState);
14007851SDana.Myers@Sun.COM         break;
14017851SDana.Myers@Sun.COM 
14027851SDana.Myers@Sun.COM 
14037851SDana.Myers@Sun.COM     case AML_ELSE_OP:
14047851SDana.Myers@Sun.COM 
14057851SDana.Myers@Sun.COM         break;
14067851SDana.Myers@Sun.COM 
14077851SDana.Myers@Sun.COM 
14087851SDana.Myers@Sun.COM     case AML_WHILE_OP:
14097851SDana.Myers@Sun.COM 
14107851SDana.Myers@Sun.COM         ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[WHILE_OP] Op=%p\n", Op));
14117851SDana.Myers@Sun.COM 
1412*9980SDana.Myers@Sun.COM         ControlState = WalkState->ControlState;
1413*9980SDana.Myers@Sun.COM         if (ControlState->Common.Value)
14147851SDana.Myers@Sun.COM         {
1415*9980SDana.Myers@Sun.COM             /* Predicate was true, the body of the loop was just executed */
14167851SDana.Myers@Sun.COM 
1417*9980SDana.Myers@Sun.COM             /*
1418*9980SDana.Myers@Sun.COM              * This loop counter mechanism allows the interpreter to escape
1419*9980SDana.Myers@Sun.COM              * possibly infinite loops. This can occur in poorly written AML
1420*9980SDana.Myers@Sun.COM              * when the hardware does not respond within a while loop and the
1421*9980SDana.Myers@Sun.COM              * loop does not implement a timeout.
1422*9980SDana.Myers@Sun.COM              */
1423*9980SDana.Myers@Sun.COM             ControlState->Control.LoopCount++;
1424*9980SDana.Myers@Sun.COM             if (ControlState->Control.LoopCount > ACPI_MAX_LOOP_ITERATIONS)
1425*9980SDana.Myers@Sun.COM             {
1426*9980SDana.Myers@Sun.COM                 Status = AE_AML_INFINITE_LOOP;
1427*9980SDana.Myers@Sun.COM                 break;
1428*9980SDana.Myers@Sun.COM             }
1429*9980SDana.Myers@Sun.COM 
1430*9980SDana.Myers@Sun.COM             /*
1431*9980SDana.Myers@Sun.COM              * Go back and evaluate the predicate and maybe execute the loop
1432*9980SDana.Myers@Sun.COM              * another time
1433*9980SDana.Myers@Sun.COM              */
14347851SDana.Myers@Sun.COM             Status = AE_CTRL_PENDING;
1435*9980SDana.Myers@Sun.COM             WalkState->AmlLastWhile = ControlState->Control.AmlPredicateStart;
1436*9980SDana.Myers@Sun.COM             break;
14377851SDana.Myers@Sun.COM         }
14387851SDana.Myers@Sun.COM 
1439*9980SDana.Myers@Sun.COM         /* Predicate was false, terminate this while loop */
1440*9980SDana.Myers@Sun.COM 
14417851SDana.Myers@Sun.COM         ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
14427851SDana.Myers@Sun.COM             "[WHILE_OP] termination! Op=%p\n",Op));
14437851SDana.Myers@Sun.COM 
14447851SDana.Myers@Sun.COM         /* Pop this control state and free it */
14457851SDana.Myers@Sun.COM 
14467851SDana.Myers@Sun.COM         ControlState = AcpiUtPopGenericState (&WalkState->ControlState);
14477851SDana.Myers@Sun.COM         AcpiUtDeleteGenericState (ControlState);
14487851SDana.Myers@Sun.COM         break;
14497851SDana.Myers@Sun.COM 
14507851SDana.Myers@Sun.COM 
14517851SDana.Myers@Sun.COM     case AML_RETURN_OP:
14527851SDana.Myers@Sun.COM 
14537851SDana.Myers@Sun.COM         ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
14547851SDana.Myers@Sun.COM             "[RETURN_OP] Op=%p Arg=%p\n",Op, Op->Common.Value.Arg));
14557851SDana.Myers@Sun.COM 
14567851SDana.Myers@Sun.COM         /*
14577851SDana.Myers@Sun.COM          * One optional operand -- the return value
14587851SDana.Myers@Sun.COM          * It can be either an immediate operand or a result that
14597851SDana.Myers@Sun.COM          * has been bubbled up the tree
14607851SDana.Myers@Sun.COM          */
14617851SDana.Myers@Sun.COM         if (Op->Common.Value.Arg)
14627851SDana.Myers@Sun.COM         {
14637851SDana.Myers@Sun.COM             /* Since we have a real Return(), delete any implicit return */
14647851SDana.Myers@Sun.COM 
14657851SDana.Myers@Sun.COM             AcpiDsClearImplicitReturn (WalkState);
14667851SDana.Myers@Sun.COM 
14677851SDana.Myers@Sun.COM             /* Return statement has an immediate operand */
14687851SDana.Myers@Sun.COM 
14697851SDana.Myers@Sun.COM             Status = AcpiDsCreateOperands (WalkState, Op->Common.Value.Arg);
14707851SDana.Myers@Sun.COM             if (ACPI_FAILURE (Status))
14717851SDana.Myers@Sun.COM             {
14727851SDana.Myers@Sun.COM                 return (Status);
14737851SDana.Myers@Sun.COM             }
14747851SDana.Myers@Sun.COM 
14757851SDana.Myers@Sun.COM             /*
14767851SDana.Myers@Sun.COM              * If value being returned is a Reference (such as
14777851SDana.Myers@Sun.COM              * an arg or local), resolve it now because it may
14787851SDana.Myers@Sun.COM              * cease to exist at the end of the method.
14797851SDana.Myers@Sun.COM              */
14807851SDana.Myers@Sun.COM             Status = AcpiExResolveToValue (&WalkState->Operands [0], WalkState);
14817851SDana.Myers@Sun.COM             if (ACPI_FAILURE (Status))
14827851SDana.Myers@Sun.COM             {
14837851SDana.Myers@Sun.COM                 return (Status);
14847851SDana.Myers@Sun.COM             }
14857851SDana.Myers@Sun.COM 
14867851SDana.Myers@Sun.COM             /*
14877851SDana.Myers@Sun.COM              * Get the return value and save as the last result
14887851SDana.Myers@Sun.COM              * value.  This is the only place where WalkState->ReturnDesc
14897851SDana.Myers@Sun.COM              * is set to anything other than zero!
14907851SDana.Myers@Sun.COM              */
14917851SDana.Myers@Sun.COM             WalkState->ReturnDesc = WalkState->Operands[0];
14927851SDana.Myers@Sun.COM         }
14937851SDana.Myers@Sun.COM         else if (WalkState->ResultCount)
14947851SDana.Myers@Sun.COM         {
14957851SDana.Myers@Sun.COM             /* Since we have a real Return(), delete any implicit return */
14967851SDana.Myers@Sun.COM 
14977851SDana.Myers@Sun.COM             AcpiDsClearImplicitReturn (WalkState);
14987851SDana.Myers@Sun.COM 
14997851SDana.Myers@Sun.COM             /*
15007851SDana.Myers@Sun.COM              * The return value has come from a previous calculation.
15017851SDana.Myers@Sun.COM              *
15027851SDana.Myers@Sun.COM              * If value being returned is a Reference (such as
15037851SDana.Myers@Sun.COM              * an arg or local), resolve it now because it may
15047851SDana.Myers@Sun.COM              * cease to exist at the end of the method.
15057851SDana.Myers@Sun.COM              *
15067851SDana.Myers@Sun.COM              * Allow references created by the Index operator to return unchanged.
15077851SDana.Myers@Sun.COM              */
15087851SDana.Myers@Sun.COM             if ((ACPI_GET_DESCRIPTOR_TYPE (WalkState->Results->Results.ObjDesc[0]) == ACPI_DESC_TYPE_OPERAND) &&
1509*9980SDana.Myers@Sun.COM                 ((WalkState->Results->Results.ObjDesc [0])->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) &&
15107851SDana.Myers@Sun.COM                 ((WalkState->Results->Results.ObjDesc [0])->Reference.Class != ACPI_REFCLASS_INDEX))
15117851SDana.Myers@Sun.COM             {
15127851SDana.Myers@Sun.COM                 Status = AcpiExResolveToValue (&WalkState->Results->Results.ObjDesc [0], WalkState);
15137851SDana.Myers@Sun.COM                 if (ACPI_FAILURE (Status))
15147851SDana.Myers@Sun.COM                 {
15157851SDana.Myers@Sun.COM                     return (Status);
15167851SDana.Myers@Sun.COM                 }
15177851SDana.Myers@Sun.COM             }
15187851SDana.Myers@Sun.COM 
15197851SDana.Myers@Sun.COM             WalkState->ReturnDesc = WalkState->Results->Results.ObjDesc [0];
15207851SDana.Myers@Sun.COM         }
15217851SDana.Myers@Sun.COM         else
15227851SDana.Myers@Sun.COM         {
15237851SDana.Myers@Sun.COM             /* No return operand */
15247851SDana.Myers@Sun.COM 
15257851SDana.Myers@Sun.COM             if (WalkState->NumOperands)
15267851SDana.Myers@Sun.COM             {
15277851SDana.Myers@Sun.COM                 AcpiUtRemoveReference (WalkState->Operands [0]);
15287851SDana.Myers@Sun.COM             }
15297851SDana.Myers@Sun.COM 
15307851SDana.Myers@Sun.COM             WalkState->Operands [0]     = NULL;
15317851SDana.Myers@Sun.COM             WalkState->NumOperands      = 0;
15327851SDana.Myers@Sun.COM             WalkState->ReturnDesc       = NULL;
15337851SDana.Myers@Sun.COM         }
15347851SDana.Myers@Sun.COM 
15357851SDana.Myers@Sun.COM 
15367851SDana.Myers@Sun.COM         ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
15377851SDana.Myers@Sun.COM             "Completed RETURN_OP State=%p, RetVal=%p\n",
15387851SDana.Myers@Sun.COM             WalkState, WalkState->ReturnDesc));
15397851SDana.Myers@Sun.COM 
15407851SDana.Myers@Sun.COM         /* End the control method execution right now */
15417851SDana.Myers@Sun.COM 
15427851SDana.Myers@Sun.COM         Status = AE_CTRL_TERMINATE;
15437851SDana.Myers@Sun.COM         break;
15447851SDana.Myers@Sun.COM 
15457851SDana.Myers@Sun.COM 
15467851SDana.Myers@Sun.COM     case AML_NOOP_OP:
15477851SDana.Myers@Sun.COM 
15487851SDana.Myers@Sun.COM         /* Just do nothing! */
15497851SDana.Myers@Sun.COM         break;
15507851SDana.Myers@Sun.COM 
15517851SDana.Myers@Sun.COM 
15527851SDana.Myers@Sun.COM     case AML_BREAK_POINT_OP:
15537851SDana.Myers@Sun.COM 
1554*9980SDana.Myers@Sun.COM         /*
1555*9980SDana.Myers@Sun.COM          * Set the single-step flag. This will cause the debugger (if present)
1556*9980SDana.Myers@Sun.COM          * to break to the console within the AML debugger at the start of the
1557*9980SDana.Myers@Sun.COM          * next AML instruction.
1558*9980SDana.Myers@Sun.COM          */
1559*9980SDana.Myers@Sun.COM         ACPI_DEBUGGER_EXEC (
1560*9980SDana.Myers@Sun.COM             AcpiGbl_CmSingleStep = TRUE);
1561*9980SDana.Myers@Sun.COM         ACPI_DEBUGGER_EXEC (
1562*9980SDana.Myers@Sun.COM             AcpiOsPrintf ("**break** Executed AML BreakPoint opcode\n"));
15637851SDana.Myers@Sun.COM 
1564*9980SDana.Myers@Sun.COM         /* Call to the OSL in case OS wants a piece of the action */
15657851SDana.Myers@Sun.COM 
1566*9980SDana.Myers@Sun.COM         Status = AcpiOsSignal (ACPI_SIGNAL_BREAKPOINT,
1567*9980SDana.Myers@Sun.COM                     "Executed AML Breakpoint opcode");
15687851SDana.Myers@Sun.COM         break;
15697851SDana.Myers@Sun.COM 
15707851SDana.Myers@Sun.COM 
15717851SDana.Myers@Sun.COM     case AML_BREAK_OP:
15727851SDana.Myers@Sun.COM     case AML_CONTINUE_OP: /* ACPI 2.0 */
15737851SDana.Myers@Sun.COM 
15747851SDana.Myers@Sun.COM 
15757851SDana.Myers@Sun.COM         /* Pop and delete control states until we find a while */
15767851SDana.Myers@Sun.COM 
15777851SDana.Myers@Sun.COM         while (WalkState->ControlState &&
15787851SDana.Myers@Sun.COM                 (WalkState->ControlState->Control.Opcode != AML_WHILE_OP))
15797851SDana.Myers@Sun.COM         {
15807851SDana.Myers@Sun.COM             ControlState = AcpiUtPopGenericState (&WalkState->ControlState);
15817851SDana.Myers@Sun.COM             AcpiUtDeleteGenericState (ControlState);
15827851SDana.Myers@Sun.COM         }
15837851SDana.Myers@Sun.COM 
15847851SDana.Myers@Sun.COM         /* No while found? */
15857851SDana.Myers@Sun.COM 
15867851SDana.Myers@Sun.COM         if (!WalkState->ControlState)
15877851SDana.Myers@Sun.COM         {
15887851SDana.Myers@Sun.COM             return (AE_AML_NO_WHILE);
15897851SDana.Myers@Sun.COM         }
15907851SDana.Myers@Sun.COM 
15917851SDana.Myers@Sun.COM         /* Was: WalkState->AmlLastWhile = WalkState->ControlState->Control.AmlPredicateStart; */
15927851SDana.Myers@Sun.COM 
15937851SDana.Myers@Sun.COM         WalkState->AmlLastWhile = WalkState->ControlState->Control.PackageEnd;
15947851SDana.Myers@Sun.COM 
15957851SDana.Myers@Sun.COM         /* Return status depending on opcode */
15967851SDana.Myers@Sun.COM 
15977851SDana.Myers@Sun.COM         if (Op->Common.AmlOpcode == AML_BREAK_OP)
15987851SDana.Myers@Sun.COM         {
15997851SDana.Myers@Sun.COM             Status = AE_CTRL_BREAK;
16007851SDana.Myers@Sun.COM         }
16017851SDana.Myers@Sun.COM         else
16027851SDana.Myers@Sun.COM         {
16037851SDana.Myers@Sun.COM             Status = AE_CTRL_CONTINUE;
16047851SDana.Myers@Sun.COM         }
16057851SDana.Myers@Sun.COM         break;
16067851SDana.Myers@Sun.COM 
16077851SDana.Myers@Sun.COM 
16087851SDana.Myers@Sun.COM     default:
16097851SDana.Myers@Sun.COM 
16107851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "Unknown control opcode=%X Op=%p",
16117851SDana.Myers@Sun.COM             Op->Common.AmlOpcode, Op));
16127851SDana.Myers@Sun.COM 
16137851SDana.Myers@Sun.COM         Status = AE_AML_BAD_OPCODE;
16147851SDana.Myers@Sun.COM         break;
16157851SDana.Myers@Sun.COM     }
16167851SDana.Myers@Sun.COM 
16177851SDana.Myers@Sun.COM     return (Status);
16187851SDana.Myers@Sun.COM }
16197851SDana.Myers@Sun.COM 
1620