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