xref: /onnv-gate/usr/src/uts/intel/io/acpica/executer/exoparg1.c (revision 11225:eb6056029d84)
17851SDana.Myers@Sun.COM 
27851SDana.Myers@Sun.COM /******************************************************************************
37851SDana.Myers@Sun.COM  *
47851SDana.Myers@Sun.COM  * Module Name: exoparg1 - AML execution - opcodes with 1 argument
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  *
129980SDana.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 __EXOPARG1_C__
1187851SDana.Myers@Sun.COM 
1197851SDana.Myers@Sun.COM #include "acpi.h"
1209980SDana.Myers@Sun.COM #include "accommon.h"
1217851SDana.Myers@Sun.COM #include "acparser.h"
1227851SDana.Myers@Sun.COM #include "acdispat.h"
1237851SDana.Myers@Sun.COM #include "acinterp.h"
1247851SDana.Myers@Sun.COM #include "amlcode.h"
1257851SDana.Myers@Sun.COM #include "acnamesp.h"
1267851SDana.Myers@Sun.COM 
1277851SDana.Myers@Sun.COM 
1287851SDana.Myers@Sun.COM #define _COMPONENT          ACPI_EXECUTER
1297851SDana.Myers@Sun.COM         ACPI_MODULE_NAME    ("exoparg1")
1307851SDana.Myers@Sun.COM 
1317851SDana.Myers@Sun.COM 
1327851SDana.Myers@Sun.COM /*!
1337851SDana.Myers@Sun.COM  * Naming convention for AML interpreter execution routines.
1347851SDana.Myers@Sun.COM  *
1357851SDana.Myers@Sun.COM  * The routines that begin execution of AML opcodes are named with a common
1367851SDana.Myers@Sun.COM  * convention based upon the number of arguments, the number of target operands,
1377851SDana.Myers@Sun.COM  * and whether or not a value is returned:
1387851SDana.Myers@Sun.COM  *
1397851SDana.Myers@Sun.COM  *      AcpiExOpcode_xA_yT_zR
1407851SDana.Myers@Sun.COM  *
1417851SDana.Myers@Sun.COM  * Where:
1427851SDana.Myers@Sun.COM  *
1437851SDana.Myers@Sun.COM  * xA - ARGUMENTS:    The number of arguments (input operands) that are
1447851SDana.Myers@Sun.COM  *                    required for this opcode type (0 through 6 args).
1457851SDana.Myers@Sun.COM  * yT - TARGETS:      The number of targets (output operands) that are required
1467851SDana.Myers@Sun.COM  *                    for this opcode type (0, 1, or 2 targets).
1477851SDana.Myers@Sun.COM  * zR - RETURN VALUE: Indicates whether this opcode type returns a value
1487851SDana.Myers@Sun.COM  *                    as the function return (0 or 1).
1497851SDana.Myers@Sun.COM  *
1507851SDana.Myers@Sun.COM  * The AcpiExOpcode* functions are called via the Dispatcher component with
1517851SDana.Myers@Sun.COM  * fully resolved operands.
1527851SDana.Myers@Sun.COM !*/
1537851SDana.Myers@Sun.COM 
1547851SDana.Myers@Sun.COM /*******************************************************************************
1557851SDana.Myers@Sun.COM  *
1567851SDana.Myers@Sun.COM  * FUNCTION:    AcpiExOpcode_0A_0T_1R
1577851SDana.Myers@Sun.COM  *
1587851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState           - Current state (contains AML opcode)
1597851SDana.Myers@Sun.COM  *
1607851SDana.Myers@Sun.COM  * RETURN:      Status
1617851SDana.Myers@Sun.COM  *
1627851SDana.Myers@Sun.COM  * DESCRIPTION: Execute operator with no operands, one return value
1637851SDana.Myers@Sun.COM  *
1647851SDana.Myers@Sun.COM  ******************************************************************************/
1657851SDana.Myers@Sun.COM 
1667851SDana.Myers@Sun.COM ACPI_STATUS
AcpiExOpcode_0A_0T_1R(ACPI_WALK_STATE * WalkState)1677851SDana.Myers@Sun.COM AcpiExOpcode_0A_0T_1R (
1687851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
1697851SDana.Myers@Sun.COM {
1707851SDana.Myers@Sun.COM     ACPI_STATUS             Status = AE_OK;
1717851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ReturnDesc = NULL;
1727851SDana.Myers@Sun.COM 
1737851SDana.Myers@Sun.COM 
1747851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_STR (ExOpcode_0A_0T_1R,
1757851SDana.Myers@Sun.COM         AcpiPsGetOpcodeName (WalkState->Opcode));
1767851SDana.Myers@Sun.COM 
1777851SDana.Myers@Sun.COM 
1787851SDana.Myers@Sun.COM     /* Examine the AML opcode */
1797851SDana.Myers@Sun.COM 
1807851SDana.Myers@Sun.COM     switch (WalkState->Opcode)
1817851SDana.Myers@Sun.COM     {
1827851SDana.Myers@Sun.COM     case AML_TIMER_OP:      /*  Timer () */
1837851SDana.Myers@Sun.COM 
1847851SDana.Myers@Sun.COM         /* Create a return object of type Integer */
1857851SDana.Myers@Sun.COM 
186*11225SDana.Myers@Sun.COM         ReturnDesc = AcpiUtCreateIntegerObject (AcpiOsGetTimer ());
1877851SDana.Myers@Sun.COM         if (!ReturnDesc)
1887851SDana.Myers@Sun.COM         {
1897851SDana.Myers@Sun.COM             Status = AE_NO_MEMORY;
1907851SDana.Myers@Sun.COM             goto Cleanup;
1917851SDana.Myers@Sun.COM         }
1927851SDana.Myers@Sun.COM         break;
1937851SDana.Myers@Sun.COM 
1947851SDana.Myers@Sun.COM     default:                /*  Unknown opcode  */
1957851SDana.Myers@Sun.COM 
1967851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
1977851SDana.Myers@Sun.COM             WalkState->Opcode));
1987851SDana.Myers@Sun.COM         Status = AE_AML_BAD_OPCODE;
1997851SDana.Myers@Sun.COM         break;
2007851SDana.Myers@Sun.COM     }
2017851SDana.Myers@Sun.COM 
2027851SDana.Myers@Sun.COM Cleanup:
2037851SDana.Myers@Sun.COM 
2047851SDana.Myers@Sun.COM     /* Delete return object on error */
2057851SDana.Myers@Sun.COM 
2067851SDana.Myers@Sun.COM     if ((ACPI_FAILURE (Status)) || WalkState->ResultObj)
2077851SDana.Myers@Sun.COM     {
2087851SDana.Myers@Sun.COM         AcpiUtRemoveReference (ReturnDesc);
2097851SDana.Myers@Sun.COM         WalkState->ResultObj = NULL;
2107851SDana.Myers@Sun.COM     }
2117851SDana.Myers@Sun.COM     else
2127851SDana.Myers@Sun.COM     {
2137851SDana.Myers@Sun.COM         /* Save the return value */
2147851SDana.Myers@Sun.COM 
2157851SDana.Myers@Sun.COM         WalkState->ResultObj = ReturnDesc;
2167851SDana.Myers@Sun.COM     }
2177851SDana.Myers@Sun.COM 
2187851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
2197851SDana.Myers@Sun.COM }
2207851SDana.Myers@Sun.COM 
2217851SDana.Myers@Sun.COM 
2227851SDana.Myers@Sun.COM /*******************************************************************************
2237851SDana.Myers@Sun.COM  *
2247851SDana.Myers@Sun.COM  * FUNCTION:    AcpiExOpcode_1A_0T_0R
2257851SDana.Myers@Sun.COM  *
2267851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState           - Current state (contains AML opcode)
2277851SDana.Myers@Sun.COM  *
2287851SDana.Myers@Sun.COM  * RETURN:      Status
2297851SDana.Myers@Sun.COM  *
2307851SDana.Myers@Sun.COM  * DESCRIPTION: Execute Type 1 monadic operator with numeric operand on
2317851SDana.Myers@Sun.COM  *              object stack
2327851SDana.Myers@Sun.COM  *
2337851SDana.Myers@Sun.COM  ******************************************************************************/
2347851SDana.Myers@Sun.COM 
2357851SDana.Myers@Sun.COM ACPI_STATUS
AcpiExOpcode_1A_0T_0R(ACPI_WALK_STATE * WalkState)2367851SDana.Myers@Sun.COM AcpiExOpcode_1A_0T_0R (
2377851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
2387851SDana.Myers@Sun.COM {
2397851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
2407851SDana.Myers@Sun.COM     ACPI_STATUS             Status = AE_OK;
2417851SDana.Myers@Sun.COM 
2427851SDana.Myers@Sun.COM 
2437851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_STR (ExOpcode_1A_0T_0R,
2447851SDana.Myers@Sun.COM         AcpiPsGetOpcodeName (WalkState->Opcode));
2457851SDana.Myers@Sun.COM 
2467851SDana.Myers@Sun.COM 
2477851SDana.Myers@Sun.COM     /* Examine the AML opcode */
2487851SDana.Myers@Sun.COM 
2497851SDana.Myers@Sun.COM     switch (WalkState->Opcode)
2507851SDana.Myers@Sun.COM     {
2517851SDana.Myers@Sun.COM     case AML_RELEASE_OP:    /*  Release (MutexObject) */
2527851SDana.Myers@Sun.COM 
2537851SDana.Myers@Sun.COM         Status = AcpiExReleaseMutex (Operand[0], WalkState);
2547851SDana.Myers@Sun.COM         break;
2557851SDana.Myers@Sun.COM 
2567851SDana.Myers@Sun.COM 
2577851SDana.Myers@Sun.COM     case AML_RESET_OP:      /*  Reset (EventObject) */
2587851SDana.Myers@Sun.COM 
2597851SDana.Myers@Sun.COM         Status = AcpiExSystemResetEvent (Operand[0]);
2607851SDana.Myers@Sun.COM         break;
2617851SDana.Myers@Sun.COM 
2627851SDana.Myers@Sun.COM 
2637851SDana.Myers@Sun.COM     case AML_SIGNAL_OP:     /*  Signal (EventObject) */
2647851SDana.Myers@Sun.COM 
2657851SDana.Myers@Sun.COM         Status = AcpiExSystemSignalEvent (Operand[0]);
2667851SDana.Myers@Sun.COM         break;
2677851SDana.Myers@Sun.COM 
2687851SDana.Myers@Sun.COM 
2697851SDana.Myers@Sun.COM     case AML_SLEEP_OP:      /*  Sleep (MsecTime) */
2707851SDana.Myers@Sun.COM 
2717851SDana.Myers@Sun.COM         Status = AcpiExSystemDoSuspend (Operand[0]->Integer.Value);
2727851SDana.Myers@Sun.COM         break;
2737851SDana.Myers@Sun.COM 
2747851SDana.Myers@Sun.COM 
2757851SDana.Myers@Sun.COM     case AML_STALL_OP:      /*  Stall (UsecTime) */
2767851SDana.Myers@Sun.COM 
2777851SDana.Myers@Sun.COM         Status = AcpiExSystemDoStall ((UINT32) Operand[0]->Integer.Value);
2787851SDana.Myers@Sun.COM         break;
2797851SDana.Myers@Sun.COM 
2807851SDana.Myers@Sun.COM 
2817851SDana.Myers@Sun.COM     case AML_UNLOAD_OP:     /*  Unload (Handle) */
2827851SDana.Myers@Sun.COM 
2837851SDana.Myers@Sun.COM         Status = AcpiExUnloadTable (Operand[0]);
2847851SDana.Myers@Sun.COM         break;
2857851SDana.Myers@Sun.COM 
2867851SDana.Myers@Sun.COM 
2877851SDana.Myers@Sun.COM     default:                /*  Unknown opcode  */
2887851SDana.Myers@Sun.COM 
2897851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
2907851SDana.Myers@Sun.COM             WalkState->Opcode));
2917851SDana.Myers@Sun.COM         Status = AE_AML_BAD_OPCODE;
2927851SDana.Myers@Sun.COM         break;
2937851SDana.Myers@Sun.COM     }
2947851SDana.Myers@Sun.COM 
2957851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
2967851SDana.Myers@Sun.COM }
2977851SDana.Myers@Sun.COM 
2987851SDana.Myers@Sun.COM 
2997851SDana.Myers@Sun.COM /*******************************************************************************
3007851SDana.Myers@Sun.COM  *
3017851SDana.Myers@Sun.COM  * FUNCTION:    AcpiExOpcode_1A_1T_0R
3027851SDana.Myers@Sun.COM  *
3037851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState           - Current state (contains AML opcode)
3047851SDana.Myers@Sun.COM  *
3057851SDana.Myers@Sun.COM  * RETURN:      Status
3067851SDana.Myers@Sun.COM  *
3077851SDana.Myers@Sun.COM  * DESCRIPTION: Execute opcode with one argument, one target, and no
3087851SDana.Myers@Sun.COM  *              return value.
3097851SDana.Myers@Sun.COM  *
3107851SDana.Myers@Sun.COM  ******************************************************************************/
3117851SDana.Myers@Sun.COM 
3127851SDana.Myers@Sun.COM ACPI_STATUS
AcpiExOpcode_1A_1T_0R(ACPI_WALK_STATE * WalkState)3137851SDana.Myers@Sun.COM AcpiExOpcode_1A_1T_0R (
3147851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
3157851SDana.Myers@Sun.COM {
3167851SDana.Myers@Sun.COM     ACPI_STATUS             Status = AE_OK;
3177851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
3187851SDana.Myers@Sun.COM 
3197851SDana.Myers@Sun.COM 
3207851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_STR (ExOpcode_1A_1T_0R,
3217851SDana.Myers@Sun.COM         AcpiPsGetOpcodeName (WalkState->Opcode));
3227851SDana.Myers@Sun.COM 
3237851SDana.Myers@Sun.COM 
3247851SDana.Myers@Sun.COM     /* Examine the AML opcode */
3257851SDana.Myers@Sun.COM 
3267851SDana.Myers@Sun.COM     switch (WalkState->Opcode)
3277851SDana.Myers@Sun.COM     {
3287851SDana.Myers@Sun.COM     case AML_LOAD_OP:
3297851SDana.Myers@Sun.COM 
3307851SDana.Myers@Sun.COM         Status = AcpiExLoadOp (Operand[0], Operand[1], WalkState);
3317851SDana.Myers@Sun.COM         break;
3327851SDana.Myers@Sun.COM 
3337851SDana.Myers@Sun.COM     default:                        /* Unknown opcode */
3347851SDana.Myers@Sun.COM 
3357851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
3367851SDana.Myers@Sun.COM             WalkState->Opcode));
3377851SDana.Myers@Sun.COM         Status = AE_AML_BAD_OPCODE;
3387851SDana.Myers@Sun.COM         goto Cleanup;
3397851SDana.Myers@Sun.COM     }
3407851SDana.Myers@Sun.COM 
3417851SDana.Myers@Sun.COM 
3427851SDana.Myers@Sun.COM Cleanup:
3437851SDana.Myers@Sun.COM 
3447851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
3457851SDana.Myers@Sun.COM }
3467851SDana.Myers@Sun.COM 
3477851SDana.Myers@Sun.COM 
3487851SDana.Myers@Sun.COM /*******************************************************************************
3497851SDana.Myers@Sun.COM  *
3507851SDana.Myers@Sun.COM  * FUNCTION:    AcpiExOpcode_1A_1T_1R
3517851SDana.Myers@Sun.COM  *
3527851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState           - Current state (contains AML opcode)
3537851SDana.Myers@Sun.COM  *
3547851SDana.Myers@Sun.COM  * RETURN:      Status
3557851SDana.Myers@Sun.COM  *
3567851SDana.Myers@Sun.COM  * DESCRIPTION: Execute opcode with one argument, one target, and a
3577851SDana.Myers@Sun.COM  *              return value.
3587851SDana.Myers@Sun.COM  *
3597851SDana.Myers@Sun.COM  ******************************************************************************/
3607851SDana.Myers@Sun.COM 
3617851SDana.Myers@Sun.COM ACPI_STATUS
AcpiExOpcode_1A_1T_1R(ACPI_WALK_STATE * WalkState)3627851SDana.Myers@Sun.COM AcpiExOpcode_1A_1T_1R (
3637851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
3647851SDana.Myers@Sun.COM {
3657851SDana.Myers@Sun.COM     ACPI_STATUS             Status = AE_OK;
3667851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
3677851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ReturnDesc = NULL;
3687851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ReturnDesc2 = NULL;
3697851SDana.Myers@Sun.COM     UINT32                  Temp32;
3707851SDana.Myers@Sun.COM     UINT32                  i;
3717851SDana.Myers@Sun.COM     ACPI_INTEGER            PowerOfTen;
3727851SDana.Myers@Sun.COM     ACPI_INTEGER            Digit;
3737851SDana.Myers@Sun.COM 
3747851SDana.Myers@Sun.COM 
3757851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_STR (ExOpcode_1A_1T_1R,
3767851SDana.Myers@Sun.COM         AcpiPsGetOpcodeName (WalkState->Opcode));
3777851SDana.Myers@Sun.COM 
3787851SDana.Myers@Sun.COM 
3797851SDana.Myers@Sun.COM     /* Examine the AML opcode */
3807851SDana.Myers@Sun.COM 
3817851SDana.Myers@Sun.COM     switch (WalkState->Opcode)
3827851SDana.Myers@Sun.COM     {
3837851SDana.Myers@Sun.COM     case AML_BIT_NOT_OP:
3847851SDana.Myers@Sun.COM     case AML_FIND_SET_LEFT_BIT_OP:
3857851SDana.Myers@Sun.COM     case AML_FIND_SET_RIGHT_BIT_OP:
3867851SDana.Myers@Sun.COM     case AML_FROM_BCD_OP:
3877851SDana.Myers@Sun.COM     case AML_TO_BCD_OP:
3887851SDana.Myers@Sun.COM     case AML_COND_REF_OF_OP:
3897851SDana.Myers@Sun.COM 
3907851SDana.Myers@Sun.COM         /* Create a return object of type Integer for these opcodes */
3917851SDana.Myers@Sun.COM 
3927851SDana.Myers@Sun.COM         ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
3937851SDana.Myers@Sun.COM         if (!ReturnDesc)
3947851SDana.Myers@Sun.COM         {
3957851SDana.Myers@Sun.COM             Status = AE_NO_MEMORY;
3967851SDana.Myers@Sun.COM             goto Cleanup;
3977851SDana.Myers@Sun.COM         }
3987851SDana.Myers@Sun.COM 
3997851SDana.Myers@Sun.COM         switch (WalkState->Opcode)
4007851SDana.Myers@Sun.COM         {
4017851SDana.Myers@Sun.COM         case AML_BIT_NOT_OP:            /* Not (Operand, Result)  */
4027851SDana.Myers@Sun.COM 
4037851SDana.Myers@Sun.COM             ReturnDesc->Integer.Value = ~Operand[0]->Integer.Value;
4047851SDana.Myers@Sun.COM             break;
4057851SDana.Myers@Sun.COM 
4067851SDana.Myers@Sun.COM 
4077851SDana.Myers@Sun.COM         case AML_FIND_SET_LEFT_BIT_OP:  /* FindSetLeftBit (Operand, Result) */
4087851SDana.Myers@Sun.COM 
4097851SDana.Myers@Sun.COM             ReturnDesc->Integer.Value = Operand[0]->Integer.Value;
4107851SDana.Myers@Sun.COM 
4117851SDana.Myers@Sun.COM             /*
4127851SDana.Myers@Sun.COM              * Acpi specification describes Integer type as a little
4137851SDana.Myers@Sun.COM              * endian unsigned value, so this boundary condition is valid.
4147851SDana.Myers@Sun.COM              */
4157851SDana.Myers@Sun.COM             for (Temp32 = 0; ReturnDesc->Integer.Value &&
4167851SDana.Myers@Sun.COM                              Temp32 < ACPI_INTEGER_BIT_SIZE; ++Temp32)
4177851SDana.Myers@Sun.COM             {
4187851SDana.Myers@Sun.COM                 ReturnDesc->Integer.Value >>= 1;
4197851SDana.Myers@Sun.COM             }
4207851SDana.Myers@Sun.COM 
4217851SDana.Myers@Sun.COM             ReturnDesc->Integer.Value = Temp32;
4227851SDana.Myers@Sun.COM             break;
4237851SDana.Myers@Sun.COM 
4247851SDana.Myers@Sun.COM 
4257851SDana.Myers@Sun.COM         case AML_FIND_SET_RIGHT_BIT_OP: /* FindSetRightBit (Operand, Result) */
4267851SDana.Myers@Sun.COM 
4277851SDana.Myers@Sun.COM             ReturnDesc->Integer.Value = Operand[0]->Integer.Value;
4287851SDana.Myers@Sun.COM 
4297851SDana.Myers@Sun.COM             /*
4307851SDana.Myers@Sun.COM              * The Acpi specification describes Integer type as a little
4317851SDana.Myers@Sun.COM              * endian unsigned value, so this boundary condition is valid.
4327851SDana.Myers@Sun.COM              */
4337851SDana.Myers@Sun.COM             for (Temp32 = 0; ReturnDesc->Integer.Value &&
4347851SDana.Myers@Sun.COM                              Temp32 < ACPI_INTEGER_BIT_SIZE; ++Temp32)
4357851SDana.Myers@Sun.COM             {
4367851SDana.Myers@Sun.COM                 ReturnDesc->Integer.Value <<= 1;
4377851SDana.Myers@Sun.COM             }
4387851SDana.Myers@Sun.COM 
4397851SDana.Myers@Sun.COM             /* Since the bit position is one-based, subtract from 33 (65) */
4407851SDana.Myers@Sun.COM 
4417851SDana.Myers@Sun.COM             ReturnDesc->Integer.Value =
4427851SDana.Myers@Sun.COM                 Temp32 == 0 ? 0 : (ACPI_INTEGER_BIT_SIZE + 1) - Temp32;
4437851SDana.Myers@Sun.COM             break;
4447851SDana.Myers@Sun.COM 
4457851SDana.Myers@Sun.COM 
4467851SDana.Myers@Sun.COM         case AML_FROM_BCD_OP:           /* FromBcd (BCDValue, Result)  */
4477851SDana.Myers@Sun.COM 
4487851SDana.Myers@Sun.COM             /*
4497851SDana.Myers@Sun.COM              * The 64-bit ACPI integer can hold 16 4-bit BCD characters
4507851SDana.Myers@Sun.COM              * (if table is 32-bit, integer can hold 8 BCD characters)
4517851SDana.Myers@Sun.COM              * Convert each 4-bit BCD value
4527851SDana.Myers@Sun.COM              */
4537851SDana.Myers@Sun.COM             PowerOfTen = 1;
4547851SDana.Myers@Sun.COM             ReturnDesc->Integer.Value = 0;
4557851SDana.Myers@Sun.COM             Digit = Operand[0]->Integer.Value;
4567851SDana.Myers@Sun.COM 
4577851SDana.Myers@Sun.COM             /* Convert each BCD digit (each is one nybble wide) */
4587851SDana.Myers@Sun.COM 
4597851SDana.Myers@Sun.COM             for (i = 0; (i < AcpiGbl_IntegerNybbleWidth) && (Digit > 0); i++)
4607851SDana.Myers@Sun.COM             {
4617851SDana.Myers@Sun.COM                 /* Get the least significant 4-bit BCD digit */
4627851SDana.Myers@Sun.COM 
4637851SDana.Myers@Sun.COM                 Temp32 = ((UINT32) Digit) & 0xF;
4647851SDana.Myers@Sun.COM 
4657851SDana.Myers@Sun.COM                 /* Check the range of the digit */
4667851SDana.Myers@Sun.COM 
4677851SDana.Myers@Sun.COM                 if (Temp32 > 9)
4687851SDana.Myers@Sun.COM                 {
4697851SDana.Myers@Sun.COM                     ACPI_ERROR ((AE_INFO,
4707851SDana.Myers@Sun.COM                         "BCD digit too large (not decimal): 0x%X",
4717851SDana.Myers@Sun.COM                         Temp32));
4727851SDana.Myers@Sun.COM 
4737851SDana.Myers@Sun.COM                     Status = AE_AML_NUMERIC_OVERFLOW;
4747851SDana.Myers@Sun.COM                     goto Cleanup;
4757851SDana.Myers@Sun.COM                 }
4767851SDana.Myers@Sun.COM 
4777851SDana.Myers@Sun.COM                 /* Sum the digit into the result with the current power of 10 */
4787851SDana.Myers@Sun.COM 
4797851SDana.Myers@Sun.COM                 ReturnDesc->Integer.Value +=
4807851SDana.Myers@Sun.COM                     (((ACPI_INTEGER) Temp32) * PowerOfTen);
4817851SDana.Myers@Sun.COM 
4827851SDana.Myers@Sun.COM                 /* Shift to next BCD digit */
4837851SDana.Myers@Sun.COM 
4847851SDana.Myers@Sun.COM                 Digit >>= 4;
4857851SDana.Myers@Sun.COM 
4867851SDana.Myers@Sun.COM                 /* Next power of 10 */
4877851SDana.Myers@Sun.COM 
4887851SDana.Myers@Sun.COM                 PowerOfTen *= 10;
4897851SDana.Myers@Sun.COM             }
4907851SDana.Myers@Sun.COM             break;
4917851SDana.Myers@Sun.COM 
4927851SDana.Myers@Sun.COM 
4937851SDana.Myers@Sun.COM         case AML_TO_BCD_OP:             /* ToBcd (Operand, Result)  */
4947851SDana.Myers@Sun.COM 
4957851SDana.Myers@Sun.COM             ReturnDesc->Integer.Value = 0;
4967851SDana.Myers@Sun.COM             Digit = Operand[0]->Integer.Value;
4977851SDana.Myers@Sun.COM 
4987851SDana.Myers@Sun.COM             /* Each BCD digit is one nybble wide */
4997851SDana.Myers@Sun.COM 
5007851SDana.Myers@Sun.COM             for (i = 0; (i < AcpiGbl_IntegerNybbleWidth) && (Digit > 0); i++)
5017851SDana.Myers@Sun.COM             {
5027851SDana.Myers@Sun.COM                 (void) AcpiUtShortDivide (Digit, 10, &Digit, &Temp32);
5037851SDana.Myers@Sun.COM 
5047851SDana.Myers@Sun.COM                 /*
5057851SDana.Myers@Sun.COM                  * Insert the BCD digit that resides in the
5067851SDana.Myers@Sun.COM                  * remainder from above
5077851SDana.Myers@Sun.COM                  */
5087851SDana.Myers@Sun.COM                 ReturnDesc->Integer.Value |=
5097851SDana.Myers@Sun.COM                     (((ACPI_INTEGER) Temp32) << ACPI_MUL_4 (i));
5107851SDana.Myers@Sun.COM             }
5117851SDana.Myers@Sun.COM 
5127851SDana.Myers@Sun.COM             /* Overflow if there is any data left in Digit */
5137851SDana.Myers@Sun.COM 
5147851SDana.Myers@Sun.COM             if (Digit > 0)
5157851SDana.Myers@Sun.COM             {
5167851SDana.Myers@Sun.COM                 ACPI_ERROR ((AE_INFO,
5177851SDana.Myers@Sun.COM                     "Integer too large to convert to BCD: %8.8X%8.8X",
5187851SDana.Myers@Sun.COM                     ACPI_FORMAT_UINT64 (Operand[0]->Integer.Value)));
5197851SDana.Myers@Sun.COM                 Status = AE_AML_NUMERIC_OVERFLOW;
5207851SDana.Myers@Sun.COM                 goto Cleanup;
5217851SDana.Myers@Sun.COM             }
5227851SDana.Myers@Sun.COM             break;
5237851SDana.Myers@Sun.COM 
5247851SDana.Myers@Sun.COM 
5257851SDana.Myers@Sun.COM         case AML_COND_REF_OF_OP:        /* CondRefOf (SourceObject, Result)  */
5267851SDana.Myers@Sun.COM 
5277851SDana.Myers@Sun.COM             /*
5287851SDana.Myers@Sun.COM              * This op is a little strange because the internal return value is
5297851SDana.Myers@Sun.COM              * different than the return value stored in the result descriptor
5307851SDana.Myers@Sun.COM              * (There are really two return values)
5317851SDana.Myers@Sun.COM              */
5327851SDana.Myers@Sun.COM             if ((ACPI_NAMESPACE_NODE *) Operand[0] == AcpiGbl_RootNode)
5337851SDana.Myers@Sun.COM             {
5347851SDana.Myers@Sun.COM                 /*
5357851SDana.Myers@Sun.COM                  * This means that the object does not exist in the namespace,
5367851SDana.Myers@Sun.COM                  * return FALSE
5377851SDana.Myers@Sun.COM                  */
5387851SDana.Myers@Sun.COM                 ReturnDesc->Integer.Value = 0;
5397851SDana.Myers@Sun.COM                 goto Cleanup;
5407851SDana.Myers@Sun.COM             }
5417851SDana.Myers@Sun.COM 
5427851SDana.Myers@Sun.COM             /* Get the object reference, store it, and remove our reference */
5437851SDana.Myers@Sun.COM 
5447851SDana.Myers@Sun.COM             Status = AcpiExGetObjectReference (Operand[0],
5457851SDana.Myers@Sun.COM                         &ReturnDesc2, WalkState);
5467851SDana.Myers@Sun.COM             if (ACPI_FAILURE (Status))
5477851SDana.Myers@Sun.COM             {
5487851SDana.Myers@Sun.COM                 goto Cleanup;
5497851SDana.Myers@Sun.COM             }
5507851SDana.Myers@Sun.COM 
5517851SDana.Myers@Sun.COM             Status = AcpiExStore (ReturnDesc2, Operand[1], WalkState);
5527851SDana.Myers@Sun.COM             AcpiUtRemoveReference (ReturnDesc2);
5537851SDana.Myers@Sun.COM 
5547851SDana.Myers@Sun.COM             /* The object exists in the namespace, return TRUE */
5557851SDana.Myers@Sun.COM 
5567851SDana.Myers@Sun.COM             ReturnDesc->Integer.Value = ACPI_INTEGER_MAX;
5577851SDana.Myers@Sun.COM             goto Cleanup;
5587851SDana.Myers@Sun.COM 
5597851SDana.Myers@Sun.COM 
5607851SDana.Myers@Sun.COM         default:
5617851SDana.Myers@Sun.COM             /* No other opcodes get here */
5627851SDana.Myers@Sun.COM             break;
5637851SDana.Myers@Sun.COM         }
5647851SDana.Myers@Sun.COM         break;
5657851SDana.Myers@Sun.COM 
5667851SDana.Myers@Sun.COM 
5677851SDana.Myers@Sun.COM     case AML_STORE_OP:              /* Store (Source, Target) */
5687851SDana.Myers@Sun.COM 
5697851SDana.Myers@Sun.COM         /*
5707851SDana.Myers@Sun.COM          * A store operand is typically a number, string, buffer or lvalue
5717851SDana.Myers@Sun.COM          * Be careful about deleting the source object,
5727851SDana.Myers@Sun.COM          * since the object itself may have been stored.
5737851SDana.Myers@Sun.COM          */
5747851SDana.Myers@Sun.COM         Status = AcpiExStore (Operand[0], Operand[1], WalkState);
5757851SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
5767851SDana.Myers@Sun.COM         {
5777851SDana.Myers@Sun.COM             return_ACPI_STATUS (Status);
5787851SDana.Myers@Sun.COM         }
5797851SDana.Myers@Sun.COM 
5807851SDana.Myers@Sun.COM         /* It is possible that the Store already produced a return object */
5817851SDana.Myers@Sun.COM 
5827851SDana.Myers@Sun.COM         if (!WalkState->ResultObj)
5837851SDana.Myers@Sun.COM         {
5847851SDana.Myers@Sun.COM             /*
5857851SDana.Myers@Sun.COM              * Normally, we would remove a reference on the Operand[0]
5867851SDana.Myers@Sun.COM              * parameter; But since it is being used as the internal return
5877851SDana.Myers@Sun.COM              * object (meaning we would normally increment it), the two
5887851SDana.Myers@Sun.COM              * cancel out, and we simply don't do anything.
5897851SDana.Myers@Sun.COM              */
5907851SDana.Myers@Sun.COM             WalkState->ResultObj = Operand[0];
5917851SDana.Myers@Sun.COM             WalkState->Operands[0] = NULL;  /* Prevent deletion */
5927851SDana.Myers@Sun.COM         }
5937851SDana.Myers@Sun.COM         return_ACPI_STATUS (Status);
5947851SDana.Myers@Sun.COM 
5957851SDana.Myers@Sun.COM 
5967851SDana.Myers@Sun.COM     /*
5977851SDana.Myers@Sun.COM      * ACPI 2.0 Opcodes
5987851SDana.Myers@Sun.COM      */
5997851SDana.Myers@Sun.COM     case AML_COPY_OP:               /* Copy (Source, Target) */
6007851SDana.Myers@Sun.COM 
6017851SDana.Myers@Sun.COM         Status = AcpiUtCopyIobjectToIobject (Operand[0], &ReturnDesc,
6027851SDana.Myers@Sun.COM                     WalkState);
6037851SDana.Myers@Sun.COM         break;
6047851SDana.Myers@Sun.COM 
6057851SDana.Myers@Sun.COM 
6067851SDana.Myers@Sun.COM     case AML_TO_DECSTRING_OP:       /* ToDecimalString (Data, Result) */
6077851SDana.Myers@Sun.COM 
6087851SDana.Myers@Sun.COM         Status = AcpiExConvertToString (Operand[0], &ReturnDesc,
6097851SDana.Myers@Sun.COM                     ACPI_EXPLICIT_CONVERT_DECIMAL);
6107851SDana.Myers@Sun.COM         if (ReturnDesc == Operand[0])
6117851SDana.Myers@Sun.COM         {
6127851SDana.Myers@Sun.COM             /* No conversion performed, add ref to handle return value */
6137851SDana.Myers@Sun.COM             AcpiUtAddReference (ReturnDesc);
6147851SDana.Myers@Sun.COM         }
6157851SDana.Myers@Sun.COM         break;
6167851SDana.Myers@Sun.COM 
6177851SDana.Myers@Sun.COM 
6187851SDana.Myers@Sun.COM     case AML_TO_HEXSTRING_OP:       /* ToHexString (Data, Result) */
6197851SDana.Myers@Sun.COM 
6207851SDana.Myers@Sun.COM         Status = AcpiExConvertToString (Operand[0], &ReturnDesc,
6217851SDana.Myers@Sun.COM                     ACPI_EXPLICIT_CONVERT_HEX);
6227851SDana.Myers@Sun.COM         if (ReturnDesc == Operand[0])
6237851SDana.Myers@Sun.COM         {
6247851SDana.Myers@Sun.COM             /* No conversion performed, add ref to handle return value */
6257851SDana.Myers@Sun.COM             AcpiUtAddReference (ReturnDesc);
6267851SDana.Myers@Sun.COM         }
6277851SDana.Myers@Sun.COM         break;
6287851SDana.Myers@Sun.COM 
6297851SDana.Myers@Sun.COM 
6307851SDana.Myers@Sun.COM     case AML_TO_BUFFER_OP:          /* ToBuffer (Data, Result) */
6317851SDana.Myers@Sun.COM 
6327851SDana.Myers@Sun.COM         Status = AcpiExConvertToBuffer (Operand[0], &ReturnDesc);
6337851SDana.Myers@Sun.COM         if (ReturnDesc == Operand[0])
6347851SDana.Myers@Sun.COM         {
6357851SDana.Myers@Sun.COM             /* No conversion performed, add ref to handle return value */
6367851SDana.Myers@Sun.COM             AcpiUtAddReference (ReturnDesc);
6377851SDana.Myers@Sun.COM         }
6387851SDana.Myers@Sun.COM         break;
6397851SDana.Myers@Sun.COM 
6407851SDana.Myers@Sun.COM 
6417851SDana.Myers@Sun.COM     case AML_TO_INTEGER_OP:         /* ToInteger (Data, Result) */
6427851SDana.Myers@Sun.COM 
6437851SDana.Myers@Sun.COM         Status = AcpiExConvertToInteger (Operand[0], &ReturnDesc,
6447851SDana.Myers@Sun.COM                     ACPI_ANY_BASE);
6457851SDana.Myers@Sun.COM         if (ReturnDesc == Operand[0])
6467851SDana.Myers@Sun.COM         {
6477851SDana.Myers@Sun.COM             /* No conversion performed, add ref to handle return value */
6487851SDana.Myers@Sun.COM             AcpiUtAddReference (ReturnDesc);
6497851SDana.Myers@Sun.COM         }
6507851SDana.Myers@Sun.COM         break;
6517851SDana.Myers@Sun.COM 
6527851SDana.Myers@Sun.COM 
6537851SDana.Myers@Sun.COM     case AML_SHIFT_LEFT_BIT_OP:     /* ShiftLeftBit (Source, BitNum)  */
6547851SDana.Myers@Sun.COM     case AML_SHIFT_RIGHT_BIT_OP:    /* ShiftRightBit (Source, BitNum) */
6557851SDana.Myers@Sun.COM 
6567851SDana.Myers@Sun.COM         /* These are two obsolete opcodes */
6577851SDana.Myers@Sun.COM 
6587851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO,
6597851SDana.Myers@Sun.COM             "%s is obsolete and not implemented",
6607851SDana.Myers@Sun.COM             AcpiPsGetOpcodeName (WalkState->Opcode)));
6617851SDana.Myers@Sun.COM         Status = AE_SUPPORT;
6627851SDana.Myers@Sun.COM         goto Cleanup;
6637851SDana.Myers@Sun.COM 
6647851SDana.Myers@Sun.COM 
6657851SDana.Myers@Sun.COM     default:                        /* Unknown opcode */
6667851SDana.Myers@Sun.COM 
6677851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
6687851SDana.Myers@Sun.COM             WalkState->Opcode));
6697851SDana.Myers@Sun.COM         Status = AE_AML_BAD_OPCODE;
6707851SDana.Myers@Sun.COM         goto Cleanup;
6717851SDana.Myers@Sun.COM     }
6727851SDana.Myers@Sun.COM 
6737851SDana.Myers@Sun.COM     if (ACPI_SUCCESS (Status))
6747851SDana.Myers@Sun.COM     {
6757851SDana.Myers@Sun.COM         /* Store the return value computed above into the target object */
6767851SDana.Myers@Sun.COM 
6777851SDana.Myers@Sun.COM         Status = AcpiExStore (ReturnDesc, Operand[1], WalkState);
6787851SDana.Myers@Sun.COM     }
6797851SDana.Myers@Sun.COM 
6807851SDana.Myers@Sun.COM 
6817851SDana.Myers@Sun.COM Cleanup:
6827851SDana.Myers@Sun.COM 
6837851SDana.Myers@Sun.COM     /* Delete return object on error */
6847851SDana.Myers@Sun.COM 
6857851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
6867851SDana.Myers@Sun.COM     {
6877851SDana.Myers@Sun.COM         AcpiUtRemoveReference (ReturnDesc);
6887851SDana.Myers@Sun.COM     }
6897851SDana.Myers@Sun.COM 
6907851SDana.Myers@Sun.COM     /* Save return object on success */
6917851SDana.Myers@Sun.COM 
6927851SDana.Myers@Sun.COM     else if (!WalkState->ResultObj)
6937851SDana.Myers@Sun.COM     {
6947851SDana.Myers@Sun.COM         WalkState->ResultObj = ReturnDesc;
6957851SDana.Myers@Sun.COM     }
6967851SDana.Myers@Sun.COM 
6977851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
6987851SDana.Myers@Sun.COM }
6997851SDana.Myers@Sun.COM 
7007851SDana.Myers@Sun.COM 
7017851SDana.Myers@Sun.COM /*******************************************************************************
7027851SDana.Myers@Sun.COM  *
7037851SDana.Myers@Sun.COM  * FUNCTION:    AcpiExOpcode_1A_0T_1R
7047851SDana.Myers@Sun.COM  *
7057851SDana.Myers@Sun.COM  * PARAMETERS:  WalkState           - Current state (contains AML opcode)
7067851SDana.Myers@Sun.COM  *
7077851SDana.Myers@Sun.COM  * RETURN:      Status
7087851SDana.Myers@Sun.COM  *
7097851SDana.Myers@Sun.COM  * DESCRIPTION: Execute opcode with one argument, no target, and a return value
7107851SDana.Myers@Sun.COM  *
7117851SDana.Myers@Sun.COM  ******************************************************************************/
7127851SDana.Myers@Sun.COM 
7137851SDana.Myers@Sun.COM ACPI_STATUS
AcpiExOpcode_1A_0T_1R(ACPI_WALK_STATE * WalkState)7147851SDana.Myers@Sun.COM AcpiExOpcode_1A_0T_1R (
7157851SDana.Myers@Sun.COM     ACPI_WALK_STATE         *WalkState)
7167851SDana.Myers@Sun.COM {
7177851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
7187851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *TempDesc;
7197851SDana.Myers@Sun.COM     ACPI_OPERAND_OBJECT     *ReturnDesc = NULL;
7207851SDana.Myers@Sun.COM     ACPI_STATUS             Status = AE_OK;
7217851SDana.Myers@Sun.COM     UINT32                  Type;
7227851SDana.Myers@Sun.COM     ACPI_INTEGER            Value;
7237851SDana.Myers@Sun.COM 
7247851SDana.Myers@Sun.COM 
7257851SDana.Myers@Sun.COM     ACPI_FUNCTION_TRACE_STR (ExOpcode_1A_0T_1R,
7267851SDana.Myers@Sun.COM         AcpiPsGetOpcodeName (WalkState->Opcode));
7277851SDana.Myers@Sun.COM 
7287851SDana.Myers@Sun.COM 
7297851SDana.Myers@Sun.COM     /* Examine the AML opcode */
7307851SDana.Myers@Sun.COM 
7317851SDana.Myers@Sun.COM     switch (WalkState->Opcode)
7327851SDana.Myers@Sun.COM     {
7337851SDana.Myers@Sun.COM     case AML_LNOT_OP:               /* LNot (Operand) */
7347851SDana.Myers@Sun.COM 
735*11225SDana.Myers@Sun.COM         ReturnDesc = AcpiUtCreateIntegerObject ((UINT64) 0);
7367851SDana.Myers@Sun.COM         if (!ReturnDesc)
7377851SDana.Myers@Sun.COM         {
7387851SDana.Myers@Sun.COM             Status = AE_NO_MEMORY;
7397851SDana.Myers@Sun.COM             goto Cleanup;
7407851SDana.Myers@Sun.COM         }
7417851SDana.Myers@Sun.COM 
7427851SDana.Myers@Sun.COM         /*
7437851SDana.Myers@Sun.COM          * Set result to ONES (TRUE) if Value == 0.  Note:
7447851SDana.Myers@Sun.COM          * ReturnDesc->Integer.Value is initially == 0 (FALSE) from above.
7457851SDana.Myers@Sun.COM          */
7467851SDana.Myers@Sun.COM         if (!Operand[0]->Integer.Value)
7477851SDana.Myers@Sun.COM         {
7487851SDana.Myers@Sun.COM             ReturnDesc->Integer.Value = ACPI_INTEGER_MAX;
7497851SDana.Myers@Sun.COM         }
7507851SDana.Myers@Sun.COM         break;
7517851SDana.Myers@Sun.COM 
7527851SDana.Myers@Sun.COM 
7537851SDana.Myers@Sun.COM     case AML_DECREMENT_OP:          /* Decrement (Operand)  */
7547851SDana.Myers@Sun.COM     case AML_INCREMENT_OP:          /* Increment (Operand)  */
7557851SDana.Myers@Sun.COM 
7567851SDana.Myers@Sun.COM         /*
7577851SDana.Myers@Sun.COM          * Create a new integer.  Can't just get the base integer and
7587851SDana.Myers@Sun.COM          * increment it because it may be an Arg or Field.
7597851SDana.Myers@Sun.COM          */
7607851SDana.Myers@Sun.COM         ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
7617851SDana.Myers@Sun.COM         if (!ReturnDesc)
7627851SDana.Myers@Sun.COM         {
7637851SDana.Myers@Sun.COM             Status = AE_NO_MEMORY;
7647851SDana.Myers@Sun.COM             goto Cleanup;
7657851SDana.Myers@Sun.COM         }
7667851SDana.Myers@Sun.COM 
7677851SDana.Myers@Sun.COM         /*
7687851SDana.Myers@Sun.COM          * Since we are expecting a Reference operand, it can be either a
7697851SDana.Myers@Sun.COM          * NS Node or an internal object.
7707851SDana.Myers@Sun.COM          */
7717851SDana.Myers@Sun.COM         TempDesc = Operand[0];
7727851SDana.Myers@Sun.COM         if (ACPI_GET_DESCRIPTOR_TYPE (TempDesc) == ACPI_DESC_TYPE_OPERAND)
7737851SDana.Myers@Sun.COM         {
7747851SDana.Myers@Sun.COM             /* Internal reference object - prevent deletion */
7757851SDana.Myers@Sun.COM 
7767851SDana.Myers@Sun.COM             AcpiUtAddReference (TempDesc);
7777851SDana.Myers@Sun.COM         }
7787851SDana.Myers@Sun.COM 
7797851SDana.Myers@Sun.COM         /*
7807851SDana.Myers@Sun.COM          * Convert the Reference operand to an Integer (This removes a
7817851SDana.Myers@Sun.COM          * reference on the Operand[0] object)
7827851SDana.Myers@Sun.COM          *
7837851SDana.Myers@Sun.COM          * NOTE:  We use LNOT_OP here in order to force resolution of the
7847851SDana.Myers@Sun.COM          * reference operand to an actual integer.
7857851SDana.Myers@Sun.COM          */
7867851SDana.Myers@Sun.COM         Status = AcpiExResolveOperands (AML_LNOT_OP, &TempDesc, WalkState);
7877851SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
7887851SDana.Myers@Sun.COM         {
7897851SDana.Myers@Sun.COM             ACPI_EXCEPTION ((AE_INFO, Status,
7907851SDana.Myers@Sun.COM                 "While resolving operands for [%s]",
7917851SDana.Myers@Sun.COM                 AcpiPsGetOpcodeName (WalkState->Opcode)));
7927851SDana.Myers@Sun.COM 
7937851SDana.Myers@Sun.COM             goto Cleanup;
7947851SDana.Myers@Sun.COM         }
7957851SDana.Myers@Sun.COM 
7967851SDana.Myers@Sun.COM         /*
7977851SDana.Myers@Sun.COM          * TempDesc is now guaranteed to be an Integer object --
7987851SDana.Myers@Sun.COM          * Perform the actual increment or decrement
7997851SDana.Myers@Sun.COM          */
8007851SDana.Myers@Sun.COM         if (WalkState->Opcode == AML_INCREMENT_OP)
8017851SDana.Myers@Sun.COM         {
8027851SDana.Myers@Sun.COM             ReturnDesc->Integer.Value = TempDesc->Integer.Value +1;
8037851SDana.Myers@Sun.COM         }
8047851SDana.Myers@Sun.COM         else
8057851SDana.Myers@Sun.COM         {
8067851SDana.Myers@Sun.COM             ReturnDesc->Integer.Value = TempDesc->Integer.Value -1;
8077851SDana.Myers@Sun.COM         }
8087851SDana.Myers@Sun.COM 
8097851SDana.Myers@Sun.COM         /* Finished with this Integer object */
8107851SDana.Myers@Sun.COM 
8117851SDana.Myers@Sun.COM         AcpiUtRemoveReference (TempDesc);
8127851SDana.Myers@Sun.COM 
8137851SDana.Myers@Sun.COM         /*
8147851SDana.Myers@Sun.COM          * Store the result back (indirectly) through the original
8157851SDana.Myers@Sun.COM          * Reference object
8167851SDana.Myers@Sun.COM          */
8177851SDana.Myers@Sun.COM         Status = AcpiExStore (ReturnDesc, Operand[0], WalkState);
8187851SDana.Myers@Sun.COM         break;
8197851SDana.Myers@Sun.COM 
8207851SDana.Myers@Sun.COM 
8217851SDana.Myers@Sun.COM     case AML_TYPE_OP:               /* ObjectType (SourceObject) */
8227851SDana.Myers@Sun.COM 
8237851SDana.Myers@Sun.COM         /*
8247851SDana.Myers@Sun.COM          * Note: The operand is not resolved at this point because we want to
8257851SDana.Myers@Sun.COM          * get the associated object, not its value.  For example, we don't
8267851SDana.Myers@Sun.COM          * want to resolve a FieldUnit to its value, we want the actual
8277851SDana.Myers@Sun.COM          * FieldUnit object.
8287851SDana.Myers@Sun.COM          */
8297851SDana.Myers@Sun.COM 
8307851SDana.Myers@Sun.COM         /* Get the type of the base object */
8317851SDana.Myers@Sun.COM 
8327851SDana.Myers@Sun.COM         Status = AcpiExResolveMultiple (WalkState, Operand[0], &Type, NULL);
8337851SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
8347851SDana.Myers@Sun.COM         {
8357851SDana.Myers@Sun.COM             goto Cleanup;
8367851SDana.Myers@Sun.COM         }
8377851SDana.Myers@Sun.COM 
8387851SDana.Myers@Sun.COM         /* Allocate a descriptor to hold the type. */
8397851SDana.Myers@Sun.COM 
840*11225SDana.Myers@Sun.COM         ReturnDesc = AcpiUtCreateIntegerObject ((UINT64) Type);
8417851SDana.Myers@Sun.COM         if (!ReturnDesc)
8427851SDana.Myers@Sun.COM         {
8437851SDana.Myers@Sun.COM             Status = AE_NO_MEMORY;
8447851SDana.Myers@Sun.COM             goto Cleanup;
8457851SDana.Myers@Sun.COM         }
8467851SDana.Myers@Sun.COM         break;
8477851SDana.Myers@Sun.COM 
8487851SDana.Myers@Sun.COM 
8497851SDana.Myers@Sun.COM     case AML_SIZE_OF_OP:            /* SizeOf (SourceObject)  */
8507851SDana.Myers@Sun.COM 
8517851SDana.Myers@Sun.COM         /*
8527851SDana.Myers@Sun.COM          * Note: The operand is not resolved at this point because we want to
8537851SDana.Myers@Sun.COM          * get the associated object, not its value.
8547851SDana.Myers@Sun.COM          */
8557851SDana.Myers@Sun.COM 
8567851SDana.Myers@Sun.COM         /* Get the base object */
8577851SDana.Myers@Sun.COM 
8587851SDana.Myers@Sun.COM         Status = AcpiExResolveMultiple (WalkState,
8597851SDana.Myers@Sun.COM                     Operand[0], &Type, &TempDesc);
8607851SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
8617851SDana.Myers@Sun.COM         {
8627851SDana.Myers@Sun.COM             goto Cleanup;
8637851SDana.Myers@Sun.COM         }
8647851SDana.Myers@Sun.COM 
8657851SDana.Myers@Sun.COM         /*
8667851SDana.Myers@Sun.COM          * The type of the base object must be integer, buffer, string, or
8677851SDana.Myers@Sun.COM          * package.  All others are not supported.
8687851SDana.Myers@Sun.COM          *
8697851SDana.Myers@Sun.COM          * NOTE: Integer is not specifically supported by the ACPI spec,
8707851SDana.Myers@Sun.COM          * but is supported implicitly via implicit operand conversion.
8717851SDana.Myers@Sun.COM          * rather than bother with conversion, we just use the byte width
8727851SDana.Myers@Sun.COM          * global (4 or 8 bytes).
8737851SDana.Myers@Sun.COM          */
8747851SDana.Myers@Sun.COM         switch (Type)
8757851SDana.Myers@Sun.COM         {
8767851SDana.Myers@Sun.COM         case ACPI_TYPE_INTEGER:
8777851SDana.Myers@Sun.COM             Value = AcpiGbl_IntegerByteWidth;
8787851SDana.Myers@Sun.COM             break;
8797851SDana.Myers@Sun.COM 
8807851SDana.Myers@Sun.COM         case ACPI_TYPE_STRING:
8817851SDana.Myers@Sun.COM             Value = TempDesc->String.Length;
8827851SDana.Myers@Sun.COM             break;
8837851SDana.Myers@Sun.COM 
8847851SDana.Myers@Sun.COM         case ACPI_TYPE_BUFFER:
8857851SDana.Myers@Sun.COM 
8867851SDana.Myers@Sun.COM             /* Buffer arguments may not be evaluated at this point */
8877851SDana.Myers@Sun.COM 
8887851SDana.Myers@Sun.COM             Status = AcpiDsGetBufferArguments (TempDesc);
8897851SDana.Myers@Sun.COM             Value = TempDesc->Buffer.Length;
8907851SDana.Myers@Sun.COM             break;
8917851SDana.Myers@Sun.COM 
8927851SDana.Myers@Sun.COM         case ACPI_TYPE_PACKAGE:
8937851SDana.Myers@Sun.COM 
8947851SDana.Myers@Sun.COM             /* Package arguments may not be evaluated at this point */
8957851SDana.Myers@Sun.COM 
8967851SDana.Myers@Sun.COM             Status = AcpiDsGetPackageArguments (TempDesc);
8977851SDana.Myers@Sun.COM             Value = TempDesc->Package.Count;
8987851SDana.Myers@Sun.COM             break;
8997851SDana.Myers@Sun.COM 
9007851SDana.Myers@Sun.COM         default:
9017851SDana.Myers@Sun.COM             ACPI_ERROR ((AE_INFO,
9027851SDana.Myers@Sun.COM                 "Operand must be Buffer/Integer/String/Package - found type %s",
9037851SDana.Myers@Sun.COM                 AcpiUtGetTypeName (Type)));
9047851SDana.Myers@Sun.COM             Status = AE_AML_OPERAND_TYPE;
9057851SDana.Myers@Sun.COM             goto Cleanup;
9067851SDana.Myers@Sun.COM         }
9077851SDana.Myers@Sun.COM 
9087851SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
9097851SDana.Myers@Sun.COM         {
9107851SDana.Myers@Sun.COM             goto Cleanup;
9117851SDana.Myers@Sun.COM         }
9127851SDana.Myers@Sun.COM 
9137851SDana.Myers@Sun.COM         /*
9147851SDana.Myers@Sun.COM          * Now that we have the size of the object, create a result
9157851SDana.Myers@Sun.COM          * object to hold the value
9167851SDana.Myers@Sun.COM          */
917*11225SDana.Myers@Sun.COM         ReturnDesc = AcpiUtCreateIntegerObject (Value);
9187851SDana.Myers@Sun.COM         if (!ReturnDesc)
9197851SDana.Myers@Sun.COM         {
9207851SDana.Myers@Sun.COM             Status = AE_NO_MEMORY;
9217851SDana.Myers@Sun.COM             goto Cleanup;
9227851SDana.Myers@Sun.COM         }
9237851SDana.Myers@Sun.COM         break;
9247851SDana.Myers@Sun.COM 
9257851SDana.Myers@Sun.COM 
9267851SDana.Myers@Sun.COM     case AML_REF_OF_OP:             /* RefOf (SourceObject) */
9277851SDana.Myers@Sun.COM 
9287851SDana.Myers@Sun.COM         Status = AcpiExGetObjectReference (Operand[0], &ReturnDesc, WalkState);
9297851SDana.Myers@Sun.COM         if (ACPI_FAILURE (Status))
9307851SDana.Myers@Sun.COM         {
9317851SDana.Myers@Sun.COM             goto Cleanup;
9327851SDana.Myers@Sun.COM         }
9337851SDana.Myers@Sun.COM         break;
9347851SDana.Myers@Sun.COM 
9357851SDana.Myers@Sun.COM 
9367851SDana.Myers@Sun.COM     case AML_DEREF_OF_OP:           /* DerefOf (ObjReference | String) */
9377851SDana.Myers@Sun.COM 
9387851SDana.Myers@Sun.COM         /* Check for a method local or argument, or standalone String */
9397851SDana.Myers@Sun.COM 
9407851SDana.Myers@Sun.COM         if (ACPI_GET_DESCRIPTOR_TYPE (Operand[0]) == ACPI_DESC_TYPE_NAMED)
9417851SDana.Myers@Sun.COM         {
9427851SDana.Myers@Sun.COM             TempDesc = AcpiNsGetAttachedObject (
9437851SDana.Myers@Sun.COM                            (ACPI_NAMESPACE_NODE *) Operand[0]);
9447851SDana.Myers@Sun.COM             if (TempDesc &&
9459980SDana.Myers@Sun.COM                  ((TempDesc->Common.Type == ACPI_TYPE_STRING) ||
9469980SDana.Myers@Sun.COM                   (TempDesc->Common.Type == ACPI_TYPE_LOCAL_REFERENCE)))
9477851SDana.Myers@Sun.COM             {
9487851SDana.Myers@Sun.COM                 Operand[0] = TempDesc;
9497851SDana.Myers@Sun.COM                 AcpiUtAddReference (TempDesc);
9507851SDana.Myers@Sun.COM             }
9517851SDana.Myers@Sun.COM             else
9527851SDana.Myers@Sun.COM             {
9537851SDana.Myers@Sun.COM                 Status = AE_AML_OPERAND_TYPE;
9547851SDana.Myers@Sun.COM                 goto Cleanup;
9557851SDana.Myers@Sun.COM             }
9567851SDana.Myers@Sun.COM         }
9577851SDana.Myers@Sun.COM         else
9587851SDana.Myers@Sun.COM         {
9599980SDana.Myers@Sun.COM             switch ((Operand[0])->Common.Type)
9607851SDana.Myers@Sun.COM             {
9617851SDana.Myers@Sun.COM             case ACPI_TYPE_LOCAL_REFERENCE:
9627851SDana.Myers@Sun.COM                 /*
9637851SDana.Myers@Sun.COM                  * This is a DerefOf (LocalX | ArgX)
9647851SDana.Myers@Sun.COM                  *
9657851SDana.Myers@Sun.COM                  * Must resolve/dereference the local/arg reference first
9667851SDana.Myers@Sun.COM                  */
9677851SDana.Myers@Sun.COM                 switch (Operand[0]->Reference.Class)
9687851SDana.Myers@Sun.COM                 {
9697851SDana.Myers@Sun.COM                 case ACPI_REFCLASS_LOCAL:
9707851SDana.Myers@Sun.COM                 case ACPI_REFCLASS_ARG:
9717851SDana.Myers@Sun.COM 
9727851SDana.Myers@Sun.COM                     /* Set Operand[0] to the value of the local/arg */
9737851SDana.Myers@Sun.COM 
9747851SDana.Myers@Sun.COM                     Status = AcpiDsMethodDataGetValue (
9757851SDana.Myers@Sun.COM                                 Operand[0]->Reference.Class,
9767851SDana.Myers@Sun.COM                                 Operand[0]->Reference.Value,
9777851SDana.Myers@Sun.COM                                 WalkState, &TempDesc);
9787851SDana.Myers@Sun.COM                     if (ACPI_FAILURE (Status))
9797851SDana.Myers@Sun.COM                     {
9807851SDana.Myers@Sun.COM                         goto Cleanup;
9817851SDana.Myers@Sun.COM                     }
9827851SDana.Myers@Sun.COM 
9837851SDana.Myers@Sun.COM                     /*
9847851SDana.Myers@Sun.COM                      * Delete our reference to the input object and
9857851SDana.Myers@Sun.COM                      * point to the object just retrieved
9867851SDana.Myers@Sun.COM                      */
9877851SDana.Myers@Sun.COM                     AcpiUtRemoveReference (Operand[0]);
9887851SDana.Myers@Sun.COM                     Operand[0] = TempDesc;
9897851SDana.Myers@Sun.COM                     break;
9907851SDana.Myers@Sun.COM 
9917851SDana.Myers@Sun.COM                 case ACPI_REFCLASS_REFOF:
9927851SDana.Myers@Sun.COM 
9937851SDana.Myers@Sun.COM                     /* Get the object to which the reference refers */
9947851SDana.Myers@Sun.COM 
9957851SDana.Myers@Sun.COM                     TempDesc = Operand[0]->Reference.Object;
9967851SDana.Myers@Sun.COM                     AcpiUtRemoveReference (Operand[0]);
9977851SDana.Myers@Sun.COM                     Operand[0] = TempDesc;
9987851SDana.Myers@Sun.COM                     break;
9997851SDana.Myers@Sun.COM 
10007851SDana.Myers@Sun.COM                 default:
10017851SDana.Myers@Sun.COM 
10027851SDana.Myers@Sun.COM                     /* Must be an Index op - handled below */
10037851SDana.Myers@Sun.COM                     break;
10047851SDana.Myers@Sun.COM                 }
10057851SDana.Myers@Sun.COM                 break;
10067851SDana.Myers@Sun.COM 
10077851SDana.Myers@Sun.COM             case ACPI_TYPE_STRING:
10087851SDana.Myers@Sun.COM                 break;
10097851SDana.Myers@Sun.COM 
10107851SDana.Myers@Sun.COM             default:
10117851SDana.Myers@Sun.COM                 Status = AE_AML_OPERAND_TYPE;
10127851SDana.Myers@Sun.COM                 goto Cleanup;
10137851SDana.Myers@Sun.COM             }
10147851SDana.Myers@Sun.COM         }
10157851SDana.Myers@Sun.COM 
10167851SDana.Myers@Sun.COM         if (ACPI_GET_DESCRIPTOR_TYPE (Operand[0]) != ACPI_DESC_TYPE_NAMED)
10177851SDana.Myers@Sun.COM         {
10189980SDana.Myers@Sun.COM             if ((Operand[0])->Common.Type == ACPI_TYPE_STRING)
10197851SDana.Myers@Sun.COM             {
10207851SDana.Myers@Sun.COM                 /*
10217851SDana.Myers@Sun.COM                  * This is a DerefOf (String). The string is a reference
10227851SDana.Myers@Sun.COM                  * to a named ACPI object.
10237851SDana.Myers@Sun.COM                  *
10247851SDana.Myers@Sun.COM                  * 1) Find the owning Node
10257851SDana.Myers@Sun.COM                  * 2) Dereference the node to an actual object. Could be a
10267851SDana.Myers@Sun.COM                  *    Field, so we need to resolve the node to a value.
10277851SDana.Myers@Sun.COM                  */
10287851SDana.Myers@Sun.COM                 Status = AcpiNsGetNode (WalkState->ScopeInfo->Scope.Node,
10297851SDana.Myers@Sun.COM                             Operand[0]->String.Pointer,
10307851SDana.Myers@Sun.COM                             ACPI_NS_SEARCH_PARENT,
10317851SDana.Myers@Sun.COM                             ACPI_CAST_INDIRECT_PTR (
10327851SDana.Myers@Sun.COM                                 ACPI_NAMESPACE_NODE, &ReturnDesc));
10337851SDana.Myers@Sun.COM                 if (ACPI_FAILURE (Status))
10347851SDana.Myers@Sun.COM                 {
10357851SDana.Myers@Sun.COM                     goto Cleanup;
10367851SDana.Myers@Sun.COM                 }
10377851SDana.Myers@Sun.COM 
10387851SDana.Myers@Sun.COM                 Status = AcpiExResolveNodeToValue (
10397851SDana.Myers@Sun.COM                             ACPI_CAST_INDIRECT_PTR (
10407851SDana.Myers@Sun.COM                                 ACPI_NAMESPACE_NODE, &ReturnDesc),
10417851SDana.Myers@Sun.COM                             WalkState);
10427851SDana.Myers@Sun.COM                 goto Cleanup;
10437851SDana.Myers@Sun.COM             }
10447851SDana.Myers@Sun.COM         }
10457851SDana.Myers@Sun.COM 
10467851SDana.Myers@Sun.COM         /* Operand[0] may have changed from the code above */
10477851SDana.Myers@Sun.COM 
10487851SDana.Myers@Sun.COM         if (ACPI_GET_DESCRIPTOR_TYPE (Operand[0]) == ACPI_DESC_TYPE_NAMED)
10497851SDana.Myers@Sun.COM         {
10507851SDana.Myers@Sun.COM             /*
10517851SDana.Myers@Sun.COM              * This is a DerefOf (ObjectReference)
10527851SDana.Myers@Sun.COM              * Get the actual object from the Node (This is the dereference).
10537851SDana.Myers@Sun.COM              * This case may only happen when a LocalX or ArgX is
10547851SDana.Myers@Sun.COM              * dereferenced above.
10557851SDana.Myers@Sun.COM              */
10567851SDana.Myers@Sun.COM             ReturnDesc = AcpiNsGetAttachedObject (
10577851SDana.Myers@Sun.COM                             (ACPI_NAMESPACE_NODE *) Operand[0]);
10587851SDana.Myers@Sun.COM             AcpiUtAddReference (ReturnDesc);
10597851SDana.Myers@Sun.COM         }
10607851SDana.Myers@Sun.COM         else
10617851SDana.Myers@Sun.COM         {
10627851SDana.Myers@Sun.COM             /*
10637851SDana.Myers@Sun.COM              * This must be a reference object produced by either the
10647851SDana.Myers@Sun.COM              * Index() or RefOf() operator
10657851SDana.Myers@Sun.COM              */
10667851SDana.Myers@Sun.COM             switch (Operand[0]->Reference.Class)
10677851SDana.Myers@Sun.COM             {
10687851SDana.Myers@Sun.COM             case ACPI_REFCLASS_INDEX:
10697851SDana.Myers@Sun.COM 
10707851SDana.Myers@Sun.COM                 /*
10717851SDana.Myers@Sun.COM                  * The target type for the Index operator must be
10727851SDana.Myers@Sun.COM                  * either a Buffer or a Package
10737851SDana.Myers@Sun.COM                  */
10747851SDana.Myers@Sun.COM                 switch (Operand[0]->Reference.TargetType)
10757851SDana.Myers@Sun.COM                 {
10767851SDana.Myers@Sun.COM                 case ACPI_TYPE_BUFFER_FIELD:
10777851SDana.Myers@Sun.COM 
10787851SDana.Myers@Sun.COM                     TempDesc = Operand[0]->Reference.Object;
10797851SDana.Myers@Sun.COM 
10807851SDana.Myers@Sun.COM                     /*
10817851SDana.Myers@Sun.COM                      * Create a new object that contains one element of the
10827851SDana.Myers@Sun.COM                      * buffer -- the element pointed to by the index.
10837851SDana.Myers@Sun.COM                      *
10847851SDana.Myers@Sun.COM                      * NOTE: index into a buffer is NOT a pointer to a
10857851SDana.Myers@Sun.COM                      * sub-buffer of the main buffer, it is only a pointer to a
10867851SDana.Myers@Sun.COM                      * single element (byte) of the buffer!
1087*11225SDana.Myers@Sun.COM                      *
1088*11225SDana.Myers@Sun.COM                      * Since we are returning the value of the buffer at the
1089*11225SDana.Myers@Sun.COM                      * indexed location, we don't need to add an additional
1090*11225SDana.Myers@Sun.COM                      * reference to the buffer itself.
10917851SDana.Myers@Sun.COM                      */
1092*11225SDana.Myers@Sun.COM                     ReturnDesc = AcpiUtCreateIntegerObject ((UINT64)
1093*11225SDana.Myers@Sun.COM                         TempDesc->Buffer.Pointer[Operand[0]->Reference.Value]);
10947851SDana.Myers@Sun.COM                     if (!ReturnDesc)
10957851SDana.Myers@Sun.COM                     {
10967851SDana.Myers@Sun.COM                         Status = AE_NO_MEMORY;
10977851SDana.Myers@Sun.COM                         goto Cleanup;
10987851SDana.Myers@Sun.COM                     }
10997851SDana.Myers@Sun.COM                     break;
11007851SDana.Myers@Sun.COM 
11017851SDana.Myers@Sun.COM 
11027851SDana.Myers@Sun.COM                 case ACPI_TYPE_PACKAGE:
11037851SDana.Myers@Sun.COM 
11047851SDana.Myers@Sun.COM                     /*
11057851SDana.Myers@Sun.COM                      * Return the referenced element of the package.  We must
11067851SDana.Myers@Sun.COM                      * add another reference to the referenced object, however.
11077851SDana.Myers@Sun.COM                      */
11087851SDana.Myers@Sun.COM                     ReturnDesc = *(Operand[0]->Reference.Where);
11097851SDana.Myers@Sun.COM                     if (ReturnDesc)
11107851SDana.Myers@Sun.COM                     {
11117851SDana.Myers@Sun.COM                         AcpiUtAddReference (ReturnDesc);
11127851SDana.Myers@Sun.COM                     }
11137851SDana.Myers@Sun.COM                     break;
11147851SDana.Myers@Sun.COM 
11157851SDana.Myers@Sun.COM 
11167851SDana.Myers@Sun.COM                 default:
11177851SDana.Myers@Sun.COM 
11187851SDana.Myers@Sun.COM                     ACPI_ERROR ((AE_INFO,
11197851SDana.Myers@Sun.COM                         "Unknown Index TargetType %X in reference object %p",
11207851SDana.Myers@Sun.COM                         Operand[0]->Reference.TargetType, Operand[0]));
11217851SDana.Myers@Sun.COM                     Status = AE_AML_OPERAND_TYPE;
11227851SDana.Myers@Sun.COM                     goto Cleanup;
11237851SDana.Myers@Sun.COM                 }
11247851SDana.Myers@Sun.COM                 break;
11257851SDana.Myers@Sun.COM 
11267851SDana.Myers@Sun.COM 
11277851SDana.Myers@Sun.COM             case ACPI_REFCLASS_REFOF:
11287851SDana.Myers@Sun.COM 
11297851SDana.Myers@Sun.COM                 ReturnDesc = Operand[0]->Reference.Object;
11307851SDana.Myers@Sun.COM 
11317851SDana.Myers@Sun.COM                 if (ACPI_GET_DESCRIPTOR_TYPE (ReturnDesc) ==
11327851SDana.Myers@Sun.COM                         ACPI_DESC_TYPE_NAMED)
11337851SDana.Myers@Sun.COM                 {
11347851SDana.Myers@Sun.COM                     ReturnDesc = AcpiNsGetAttachedObject (
11357851SDana.Myers@Sun.COM                                     (ACPI_NAMESPACE_NODE *) ReturnDesc);
11367851SDana.Myers@Sun.COM                 }
11377851SDana.Myers@Sun.COM 
11387851SDana.Myers@Sun.COM                 /* Add another reference to the object! */
11397851SDana.Myers@Sun.COM 
11407851SDana.Myers@Sun.COM                 AcpiUtAddReference (ReturnDesc);
11417851SDana.Myers@Sun.COM                 break;
11427851SDana.Myers@Sun.COM 
11437851SDana.Myers@Sun.COM 
11447851SDana.Myers@Sun.COM             default:
11457851SDana.Myers@Sun.COM                 ACPI_ERROR ((AE_INFO,
11467851SDana.Myers@Sun.COM                     "Unknown class in reference(%p) - %2.2X",
11477851SDana.Myers@Sun.COM                     Operand[0], Operand[0]->Reference.Class));
11487851SDana.Myers@Sun.COM 
11497851SDana.Myers@Sun.COM                 Status = AE_TYPE;
11507851SDana.Myers@Sun.COM                 goto Cleanup;
11517851SDana.Myers@Sun.COM             }
11527851SDana.Myers@Sun.COM         }
11537851SDana.Myers@Sun.COM         break;
11547851SDana.Myers@Sun.COM 
11557851SDana.Myers@Sun.COM 
11567851SDana.Myers@Sun.COM     default:
11577851SDana.Myers@Sun.COM 
11587851SDana.Myers@Sun.COM         ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
11597851SDana.Myers@Sun.COM             WalkState->Opcode));
11607851SDana.Myers@Sun.COM         Status = AE_AML_BAD_OPCODE;
11617851SDana.Myers@Sun.COM         goto Cleanup;
11627851SDana.Myers@Sun.COM     }
11637851SDana.Myers@Sun.COM 
11647851SDana.Myers@Sun.COM 
11657851SDana.Myers@Sun.COM Cleanup:
11667851SDana.Myers@Sun.COM 
11677851SDana.Myers@Sun.COM     /* Delete return object on error */
11687851SDana.Myers@Sun.COM 
11697851SDana.Myers@Sun.COM     if (ACPI_FAILURE (Status))
11707851SDana.Myers@Sun.COM     {
11717851SDana.Myers@Sun.COM         AcpiUtRemoveReference (ReturnDesc);
11727851SDana.Myers@Sun.COM     }
11737851SDana.Myers@Sun.COM 
11747851SDana.Myers@Sun.COM     /* Save return object on success */
11757851SDana.Myers@Sun.COM 
11767851SDana.Myers@Sun.COM     else
11777851SDana.Myers@Sun.COM     {
11787851SDana.Myers@Sun.COM         WalkState->ResultObj = ReturnDesc;
11797851SDana.Myers@Sun.COM     }
11807851SDana.Myers@Sun.COM 
11817851SDana.Myers@Sun.COM     return_ACPI_STATUS (Status);
11827851SDana.Myers@Sun.COM }
11837851SDana.Myers@Sun.COM 
1184