Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /******************************************************************************
  2.  *
  3.  * Module Name: exoparg2 - AML execution - opcodes with 2 arguments
  4.  *
  5.  *****************************************************************************/
  6.  
  7. /******************************************************************************
  8.  *
  9.  * 1. Copyright Notice
  10.  *
  11.  * Some or all of this work - Copyright (c) 1999 - 2010, Intel Corp.
  12.  * All rights reserved.
  13.  *
  14.  * 2. License
  15.  *
  16.  * 2.1. This is your license from Intel Corp. under its intellectual property
  17.  * rights.  You may have additional license terms from the party that provided
  18.  * you this software, covering your right to use that party's intellectual
  19.  * property rights.
  20.  *
  21.  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
  22.  * copy of the source code appearing in this file ("Covered Code") an
  23.  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
  24.  * base code distributed originally by Intel ("Original Intel Code") to copy,
  25.  * make derivatives, distribute, use and display any portion of the Covered
  26.  * Code in any form, with the right to sublicense such rights; and
  27.  *
  28.  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
  29.  * license (with the right to sublicense), under only those claims of Intel
  30.  * patents that are infringed by the Original Intel Code, to make, use, sell,
  31.  * offer to sell, and import the Covered Code and derivative works thereof
  32.  * solely to the minimum extent necessary to exercise the above copyright
  33.  * license, and in no event shall the patent license extend to any additions
  34.  * to or modifications of the Original Intel Code.  No other license or right
  35.  * is granted directly or by implication, estoppel or otherwise;
  36.  *
  37.  * The above copyright and patent license is granted only if the following
  38.  * conditions are met:
  39.  *
  40.  * 3. Conditions
  41.  *
  42.  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
  43.  * Redistribution of source code of any substantial portion of the Covered
  44.  * Code or modification with rights to further distribute source must include
  45.  * the above Copyright Notice, the above License, this list of Conditions,
  46.  * and the following Disclaimer and Export Compliance provision.  In addition,
  47.  * Licensee must cause all Covered Code to which Licensee contributes to
  48.  * contain a file documenting the changes Licensee made to create that Covered
  49.  * Code and the date of any change.  Licensee must include in that file the
  50.  * documentation of any changes made by any predecessor Licensee.  Licensee
  51.  * must include a prominent statement that the modification is derived,
  52.  * directly or indirectly, from Original Intel Code.
  53.  *
  54.  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
  55.  * Redistribution of source code of any substantial portion of the Covered
  56.  * Code or modification without rights to further distribute source must
  57.  * include the following Disclaimer and Export Compliance provision in the
  58.  * documentation and/or other materials provided with distribution.  In
  59.  * addition, Licensee may not authorize further sublicense of source of any
  60.  * portion of the Covered Code, and must include terms to the effect that the
  61.  * license from Licensee to its licensee is limited to the intellectual
  62.  * property embodied in the software Licensee provides to its licensee, and
  63.  * not to intellectual property embodied in modifications its licensee may
  64.  * make.
  65.  *
  66.  * 3.3. Redistribution of Executable. Redistribution in executable form of any
  67.  * substantial portion of the Covered Code or modification must reproduce the
  68.  * above Copyright Notice, and the following Disclaimer and Export Compliance
  69.  * provision in the documentation and/or other materials provided with the
  70.  * distribution.
  71.  *
  72.  * 3.4. Intel retains all right, title, and interest in and to the Original
  73.  * Intel Code.
  74.  *
  75.  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
  76.  * Intel shall be used in advertising or otherwise to promote the sale, use or
  77.  * other dealings in products derived from or relating to the Covered Code
  78.  * without prior written authorization from Intel.
  79.  *
  80.  * 4. Disclaimer and Export Compliance
  81.  *
  82.  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
  83.  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
  84.  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
  85.  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
  86.  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
  87.  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
  88.  * PARTICULAR PURPOSE.
  89.  *
  90.  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
  91.  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
  92.  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
  93.  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
  94.  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
  95.  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
  96.  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
  97.  * LIMITED REMEDY.
  98.  *
  99.  * 4.3. Licensee shall not export, either directly or indirectly, any of this
  100.  * software or system incorporating such software without first obtaining any
  101.  * required license or other approval from the U. S. Department of Commerce or
  102.  * any other agency or department of the United States Government.  In the
  103.  * event Licensee exports any such software from the United States or
  104.  * re-exports any such software from a foreign destination, Licensee shall
  105.  * ensure that the distribution and export/re-export of the software is in
  106.  * compliance with all laws, regulations, orders, or other restrictions of the
  107.  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
  108.  * any of its subsidiaries will export/re-export any technical data, process,
  109.  * software, or service, directly or indirectly, to any country for which the
  110.  * United States government or any agency thereof requires an export license,
  111.  * other governmental approval, or letter of assurance, without first obtaining
  112.  * such license, approval or letter.
  113.  *
  114.  *****************************************************************************/
  115.  
  116.  
  117. #define __EXOPARG2_C__
  118.  
  119. #include "acpi.h"
  120. #include "accommon.h"
  121. #include "acparser.h"
  122. #include "acinterp.h"
  123. #include "acevents.h"
  124. #include "amlcode.h"
  125.  
  126.  
  127. #define _COMPONENT          ACPI_EXECUTER
  128.         ACPI_MODULE_NAME    ("exoparg2")
  129.  
  130.  
  131. /*!
  132.  * Naming convention for AML interpreter execution routines.
  133.  *
  134.  * The routines that begin execution of AML opcodes are named with a common
  135.  * convention based upon the number of arguments, the number of target operands,
  136.  * and whether or not a value is returned:
  137.  *
  138.  *      AcpiExOpcode_xA_yT_zR
  139.  *
  140.  * Where:
  141.  *
  142.  * xA - ARGUMENTS:    The number of arguments (input operands) that are
  143.  *                    required for this opcode type (1 through 6 args).
  144.  * yT - TARGETS:      The number of targets (output operands) that are required
  145.  *                    for this opcode type (0, 1, or 2 targets).
  146.  * zR - RETURN VALUE: Indicates whether this opcode type returns a value
  147.  *                    as the function return (0 or 1).
  148.  *
  149.  * The AcpiExOpcode* functions are called via the Dispatcher component with
  150.  * fully resolved operands.
  151. !*/
  152.  
  153.  
  154. /*******************************************************************************
  155.  *
  156.  * FUNCTION:    AcpiExOpcode_2A_0T_0R
  157.  *
  158.  * PARAMETERS:  WalkState           - Current walk state
  159.  *
  160.  * RETURN:      Status
  161.  *
  162.  * DESCRIPTION: Execute opcode with two arguments, no target, and no return
  163.  *              value.
  164.  *
  165.  * ALLOCATION:  Deletes both operands
  166.  *
  167.  ******************************************************************************/
  168.  
  169. ACPI_STATUS
  170. AcpiExOpcode_2A_0T_0R (
  171.     ACPI_WALK_STATE         *WalkState)
  172. {
  173.     ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
  174.     ACPI_NAMESPACE_NODE     *Node;
  175.     UINT32                  Value;
  176.     ACPI_STATUS             Status = AE_OK;
  177.  
  178.  
  179.     ACPI_FUNCTION_TRACE_STR (ExOpcode_2A_0T_0R,
  180.             AcpiPsGetOpcodeName (WalkState->Opcode));
  181.  
  182.  
  183.     /* Examine the opcode */
  184.  
  185.     switch (WalkState->Opcode)
  186.     {
  187.     case AML_NOTIFY_OP:         /* Notify (NotifyObject, NotifyValue) */
  188.  
  189.         /* The first operand is a namespace node */
  190.  
  191.         Node = (ACPI_NAMESPACE_NODE *) Operand[0];
  192.  
  193.         /* Second value is the notify value */
  194.  
  195.         Value = (UINT32) Operand[1]->Integer.Value;
  196.  
  197.         /* Are notifies allowed on this object? */
  198.  
  199.         if (!AcpiEvIsNotifyObject (Node))
  200.         {
  201.             ACPI_ERROR ((AE_INFO,
  202.                 "Unexpected notify object type [%s]",
  203.                 AcpiUtGetTypeName (Node->Type)));
  204.  
  205.             Status = AE_AML_OPERAND_TYPE;
  206.             break;
  207.         }
  208.  
  209.         /*
  210.          * Dispatch the notify to the appropriate handler
  211.          * NOTE: the request is queued for execution after this method
  212.          * completes.  The notify handlers are NOT invoked synchronously
  213.          * from this thread -- because handlers may in turn run other
  214.          * control methods.
  215.          */
  216.         Status = AcpiEvQueueNotifyRequest (Node, Value);
  217.         break;
  218.  
  219.  
  220.     default:
  221.  
  222.         ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
  223.             WalkState->Opcode));
  224.         Status = AE_AML_BAD_OPCODE;
  225.     }
  226.  
  227.     return_ACPI_STATUS (Status);
  228. }
  229.  
  230.  
  231. /*******************************************************************************
  232.  *
  233.  * FUNCTION:    AcpiExOpcode_2A_2T_1R
  234.  *
  235.  * PARAMETERS:  WalkState           - Current walk state
  236.  *
  237.  * RETURN:      Status
  238.  *
  239.  * DESCRIPTION: Execute a dyadic operator (2 operands) with 2 output targets
  240.  *              and one implicit return value.
  241.  *
  242.  ******************************************************************************/
  243.  
  244. ACPI_STATUS
  245. AcpiExOpcode_2A_2T_1R (
  246.     ACPI_WALK_STATE         *WalkState)
  247. {
  248.     ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
  249.     ACPI_OPERAND_OBJECT     *ReturnDesc1 = NULL;
  250.     ACPI_OPERAND_OBJECT     *ReturnDesc2 = NULL;
  251.     ACPI_STATUS             Status;
  252.  
  253.  
  254.     ACPI_FUNCTION_TRACE_STR (ExOpcode_2A_2T_1R,
  255.         AcpiPsGetOpcodeName (WalkState->Opcode));
  256.  
  257.  
  258.     /* Execute the opcode */
  259.  
  260.     switch (WalkState->Opcode)
  261.     {
  262.     case AML_DIVIDE_OP:
  263.  
  264.         /* Divide (Dividend, Divisor, RemainderResult QuotientResult) */
  265.  
  266.         ReturnDesc1 = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
  267.         if (!ReturnDesc1)
  268.         {
  269.             Status = AE_NO_MEMORY;
  270.             goto Cleanup;
  271.         }
  272.  
  273.         ReturnDesc2 = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
  274.         if (!ReturnDesc2)
  275.         {
  276.             Status = AE_NO_MEMORY;
  277.             goto Cleanup;
  278.         }
  279.  
  280.         /* Quotient to ReturnDesc1, remainder to ReturnDesc2 */
  281.  
  282.         Status = AcpiUtDivide (Operand[0]->Integer.Value,
  283.                                Operand[1]->Integer.Value,
  284.                                &ReturnDesc1->Integer.Value,
  285.                                &ReturnDesc2->Integer.Value);
  286.         if (ACPI_FAILURE (Status))
  287.         {
  288.             goto Cleanup;
  289.         }
  290.         break;
  291.  
  292.  
  293.     default:
  294.  
  295.         ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
  296.             WalkState->Opcode));
  297.         Status = AE_AML_BAD_OPCODE;
  298.         goto Cleanup;
  299.     }
  300.  
  301.     /* Store the results to the target reference operands */
  302.  
  303.     Status = AcpiExStore (ReturnDesc2, Operand[2], WalkState);
  304.     if (ACPI_FAILURE (Status))
  305.     {
  306.         goto Cleanup;
  307.     }
  308.  
  309.     Status = AcpiExStore (ReturnDesc1, Operand[3], WalkState);
  310.     if (ACPI_FAILURE (Status))
  311.     {
  312.         goto Cleanup;
  313.     }
  314.  
  315. Cleanup:
  316.     /*
  317.      * Since the remainder is not returned indirectly, remove a reference to
  318.      * it. Only the quotient is returned indirectly.
  319.      */
  320.     AcpiUtRemoveReference (ReturnDesc2);
  321.  
  322.     if (ACPI_FAILURE (Status))
  323.     {
  324.         /* Delete the return object */
  325.  
  326.         AcpiUtRemoveReference (ReturnDesc1);
  327.     }
  328.  
  329.     /* Save return object (the remainder) on success */
  330.  
  331.     else
  332.     {
  333.         WalkState->ResultObj = ReturnDesc1;
  334.     }
  335.  
  336.     return_ACPI_STATUS (Status);
  337. }
  338.  
  339.  
  340. /*******************************************************************************
  341.  *
  342.  * FUNCTION:    AcpiExOpcode_2A_1T_1R
  343.  *
  344.  * PARAMETERS:  WalkState           - Current walk state
  345.  *
  346.  * RETURN:      Status
  347.  *
  348.  * DESCRIPTION: Execute opcode with two arguments, one target, and a return
  349.  *              value.
  350.  *
  351.  ******************************************************************************/
  352.  
  353. ACPI_STATUS
  354. AcpiExOpcode_2A_1T_1R (
  355.     ACPI_WALK_STATE         *WalkState)
  356. {
  357.     ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
  358.     ACPI_OPERAND_OBJECT     *ReturnDesc = NULL;
  359.     UINT64                  Index;
  360.     ACPI_STATUS             Status = AE_OK;
  361.     ACPI_SIZE               Length;
  362.  
  363.  
  364.     ACPI_FUNCTION_TRACE_STR (ExOpcode_2A_1T_1R,
  365.         AcpiPsGetOpcodeName (WalkState->Opcode));
  366.  
  367.  
  368.     /* Execute the opcode */
  369.  
  370.     if (WalkState->OpInfo->Flags & AML_MATH)
  371.     {
  372.         /* All simple math opcodes (add, etc.) */
  373.  
  374.         ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
  375.         if (!ReturnDesc)
  376.         {
  377.             Status = AE_NO_MEMORY;
  378.             goto Cleanup;
  379.         }
  380.  
  381.         ReturnDesc->Integer.Value = AcpiExDoMathOp (WalkState->Opcode,
  382.                                                 Operand[0]->Integer.Value,
  383.                                                 Operand[1]->Integer.Value);
  384.         goto StoreResultToTarget;
  385.     }
  386.  
  387.     switch (WalkState->Opcode)
  388.     {
  389.     case AML_MOD_OP: /* Mod (Dividend, Divisor, RemainderResult (ACPI 2.0) */
  390.  
  391.         ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
  392.         if (!ReturnDesc)
  393.         {
  394.             Status = AE_NO_MEMORY;
  395.             goto Cleanup;
  396.         }
  397.  
  398.         /* ReturnDesc will contain the remainder */
  399.  
  400.         Status = AcpiUtDivide (Operand[0]->Integer.Value,
  401.                                Operand[1]->Integer.Value,
  402.                                NULL,
  403.                                &ReturnDesc->Integer.Value);
  404.         break;
  405.  
  406.  
  407.     case AML_CONCAT_OP: /* Concatenate (Data1, Data2, Result) */
  408.  
  409.         Status = AcpiExDoConcatenate (Operand[0], Operand[1],
  410.                     &ReturnDesc, WalkState);
  411.         break;
  412.  
  413.  
  414.     case AML_TO_STRING_OP: /* ToString (Buffer, Length, Result) (ACPI 2.0) */
  415.  
  416.         /*
  417.          * Input object is guaranteed to be a buffer at this point (it may have
  418.          * been converted.)  Copy the raw buffer data to a new object of
  419.          * type String.
  420.          */
  421.  
  422.         /*
  423.          * Get the length of the new string. It is the smallest of:
  424.          * 1) Length of the input buffer
  425.          * 2) Max length as specified in the ToString operator
  426.          * 3) Length of input buffer up to a zero byte (null terminator)
  427.          *
  428.          * NOTE: A length of zero is ok, and will create a zero-length, null
  429.          *       terminated string.
  430.          */
  431.         Length = 0;
  432.         while ((Length < Operand[0]->Buffer.Length) &&
  433.                (Length < Operand[1]->Integer.Value) &&
  434.                (Operand[0]->Buffer.Pointer[Length]))
  435.         {
  436.             Length++;
  437.         }
  438.  
  439.         /* Allocate a new string object */
  440.  
  441.         ReturnDesc = AcpiUtCreateStringObject (Length);
  442.         if (!ReturnDesc)
  443.         {
  444.             Status = AE_NO_MEMORY;
  445.             goto Cleanup;
  446.         }
  447.  
  448.         /*
  449.          * Copy the raw buffer data with no transform.
  450.          * (NULL terminated already)
  451.          */
  452.         ACPI_MEMCPY (ReturnDesc->String.Pointer,
  453.             Operand[0]->Buffer.Pointer, Length);
  454.         break;
  455.  
  456.  
  457.     case AML_CONCAT_RES_OP:
  458.  
  459.         /* ConcatenateResTemplate (Buffer, Buffer, Result) (ACPI 2.0) */
  460.  
  461.         Status = AcpiExConcatTemplate (Operand[0], Operand[1],
  462.                     &ReturnDesc, WalkState);
  463.         break;
  464.  
  465.  
  466.     case AML_INDEX_OP:              /* Index (Source Index Result) */
  467.  
  468.         /* Create the internal return object */
  469.  
  470.         ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_REFERENCE);
  471.         if (!ReturnDesc)
  472.         {
  473.             Status = AE_NO_MEMORY;
  474.             goto Cleanup;
  475.         }
  476.  
  477.         /* Initialize the Index reference object */
  478.  
  479.         Index = Operand[1]->Integer.Value;
  480.         ReturnDesc->Reference.Value = (UINT32) Index;
  481.         ReturnDesc->Reference.Class = ACPI_REFCLASS_INDEX;
  482.  
  483.         /*
  484.          * At this point, the Source operand is a String, Buffer, or Package.
  485.          * Verify that the index is within range.
  486.          */
  487.         switch ((Operand[0])->Common.Type)
  488.         {
  489.         case ACPI_TYPE_STRING:
  490.  
  491.             if (Index >= Operand[0]->String.Length)
  492.             {
  493.                 Status = AE_AML_STRING_LIMIT;
  494.             }
  495.  
  496.             ReturnDesc->Reference.TargetType = ACPI_TYPE_BUFFER_FIELD;
  497.             break;
  498.  
  499.         case ACPI_TYPE_BUFFER:
  500.  
  501.             if (Index >= Operand[0]->Buffer.Length)
  502.             {
  503.                 Status = AE_AML_BUFFER_LIMIT;
  504.             }
  505.  
  506.             ReturnDesc->Reference.TargetType = ACPI_TYPE_BUFFER_FIELD;
  507.             break;
  508.  
  509.         case ACPI_TYPE_PACKAGE:
  510.  
  511.             if (Index >= Operand[0]->Package.Count)
  512.             {
  513.                 Status = AE_AML_PACKAGE_LIMIT;
  514.             }
  515.  
  516.             ReturnDesc->Reference.TargetType = ACPI_TYPE_PACKAGE;
  517.             ReturnDesc->Reference.Where = &Operand[0]->Package.Elements [Index];
  518.             break;
  519.  
  520.         default:
  521.  
  522.             Status = AE_AML_INTERNAL;
  523.             goto Cleanup;
  524.         }
  525.  
  526.         /* Failure means that the Index was beyond the end of the object */
  527.  
  528.         if (ACPI_FAILURE (Status))
  529.         {
  530.             ACPI_EXCEPTION ((AE_INFO, Status,
  531.                 "Index (0x%8.8X%8.8X) is beyond end of object",
  532.                 ACPI_FORMAT_UINT64 (Index)));
  533.             goto Cleanup;
  534.         }
  535.  
  536.         /*
  537.          * Save the target object and add a reference to it for the life
  538.          * of the index
  539.          */
  540.         ReturnDesc->Reference.Object = Operand[0];
  541.         AcpiUtAddReference (Operand[0]);
  542.  
  543.         /* Store the reference to the Target */
  544.  
  545.         Status = AcpiExStore (ReturnDesc, Operand[2], WalkState);
  546.  
  547.         /* Return the reference */
  548.  
  549.         WalkState->ResultObj = ReturnDesc;
  550.         goto Cleanup;
  551.  
  552.  
  553.     default:
  554.  
  555.         ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
  556.             WalkState->Opcode));
  557.         Status = AE_AML_BAD_OPCODE;
  558.         break;
  559.     }
  560.  
  561.  
  562. StoreResultToTarget:
  563.  
  564.     if (ACPI_SUCCESS (Status))
  565.     {
  566.         /*
  567.          * Store the result of the operation (which is now in ReturnDesc) into
  568.          * the Target descriptor.
  569.          */
  570.         Status = AcpiExStore (ReturnDesc, Operand[2], WalkState);
  571.         if (ACPI_FAILURE (Status))
  572.         {
  573.             goto Cleanup;
  574.         }
  575.  
  576.         if (!WalkState->ResultObj)
  577.         {
  578.             WalkState->ResultObj = ReturnDesc;
  579.         }
  580.     }
  581.  
  582.  
  583. Cleanup:
  584.  
  585.     /* Delete return object on error */
  586.  
  587.     if (ACPI_FAILURE (Status))
  588.     {
  589.         AcpiUtRemoveReference (ReturnDesc);
  590.         WalkState->ResultObj = NULL;
  591.     }
  592.  
  593.     return_ACPI_STATUS (Status);
  594. }
  595.  
  596.  
  597. /*******************************************************************************
  598.  *
  599.  * FUNCTION:    AcpiExOpcode_2A_0T_1R
  600.  *
  601.  * PARAMETERS:  WalkState           - Current walk state
  602.  *
  603.  * RETURN:      Status
  604.  *
  605.  * DESCRIPTION: Execute opcode with 2 arguments, no target, and a return value
  606.  *
  607.  ******************************************************************************/
  608.  
  609. ACPI_STATUS
  610. AcpiExOpcode_2A_0T_1R (
  611.     ACPI_WALK_STATE         *WalkState)
  612. {
  613.     ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
  614.     ACPI_OPERAND_OBJECT     *ReturnDesc = NULL;
  615.     ACPI_STATUS             Status = AE_OK;
  616.     BOOLEAN                 LogicalResult = FALSE;
  617.  
  618.  
  619.     ACPI_FUNCTION_TRACE_STR (ExOpcode_2A_0T_1R,
  620.         AcpiPsGetOpcodeName (WalkState->Opcode));
  621.  
  622.  
  623.     /* Create the internal return object */
  624.  
  625.     ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
  626.     if (!ReturnDesc)
  627.     {
  628.         Status = AE_NO_MEMORY;
  629.         goto Cleanup;
  630.     }
  631.  
  632.     /* Execute the Opcode */
  633.  
  634.     if (WalkState->OpInfo->Flags & AML_LOGICAL_NUMERIC)
  635.     {
  636.         /* LogicalOp  (Operand0, Operand1) */
  637.  
  638.         Status = AcpiExDoLogicalNumericOp (WalkState->Opcode,
  639.                         Operand[0]->Integer.Value, Operand[1]->Integer.Value,
  640.                         &LogicalResult);
  641.         goto StoreLogicalResult;
  642.     }
  643.     else if (WalkState->OpInfo->Flags & AML_LOGICAL)
  644.     {
  645.         /* LogicalOp  (Operand0, Operand1) */
  646.  
  647.         Status = AcpiExDoLogicalOp (WalkState->Opcode, Operand[0],
  648.                     Operand[1], &LogicalResult);
  649.         goto StoreLogicalResult;
  650.     }
  651.  
  652.     switch (WalkState->Opcode)
  653.     {
  654.     case AML_ACQUIRE_OP:            /* Acquire (MutexObject, Timeout) */
  655.  
  656.         Status = AcpiExAcquireMutex (Operand[1], Operand[0], WalkState);
  657.         if (Status == AE_TIME)
  658.         {
  659.             LogicalResult = TRUE;       /* TRUE = Acquire timed out */
  660.             Status = AE_OK;
  661.         }
  662.         break;
  663.  
  664.  
  665.     case AML_WAIT_OP:               /* Wait (EventObject, Timeout) */
  666.  
  667.         Status = AcpiExSystemWaitEvent (Operand[1], Operand[0]);
  668.         if (Status == AE_TIME)
  669.         {
  670.             LogicalResult = TRUE;       /* TRUE, Wait timed out */
  671.             Status = AE_OK;
  672.         }
  673.         break;
  674.  
  675.  
  676.     default:
  677.  
  678.         ACPI_ERROR ((AE_INFO, "Unknown AML opcode 0x%X",
  679.             WalkState->Opcode));
  680.         Status = AE_AML_BAD_OPCODE;
  681.         goto Cleanup;
  682.     }
  683.  
  684.  
  685. StoreLogicalResult:
  686.     /*
  687.      * Set return value to according to LogicalResult. logical TRUE (all ones)
  688.      * Default is FALSE (zero)
  689.      */
  690.     if (LogicalResult)
  691.     {
  692.         ReturnDesc->Integer.Value = ACPI_UINT64_MAX;
  693.     }
  694.  
  695. Cleanup:
  696.  
  697.     /* Delete return object on error */
  698.  
  699.     if (ACPI_FAILURE (Status))
  700.     {
  701.         AcpiUtRemoveReference (ReturnDesc);
  702.     }
  703.  
  704.     /* Save return object on success */
  705.  
  706.     else
  707.     {
  708.         WalkState->ResultObj = ReturnDesc;
  709.     }
  710.  
  711.     return_ACPI_STATUS (Status);
  712. }
  713.  
  714.  
  715.