Back to home page

Quest Cross Reference

 
 

    


Warning, cross-references for /kernel/drivers/acpica/excreate.c need to be fixed.

0001 /******************************************************************************
0002  *
0003  * Module Name: excreate - Named object creation
0004  *
0005  *****************************************************************************/
0006 
0007 /******************************************************************************
0008  *
0009  * 1. Copyright Notice
0010  *
0011  * Some or all of this work - Copyright (c) 1999 - 2009, Intel Corp.
0012  * All rights reserved.
0013  *
0014  * 2. License
0015  *
0016  * 2.1. This is your license from Intel Corp. under its intellectual property
0017  * rights.  You may have additional license terms from the party that provided
0018  * you this software, covering your right to use that party's intellectual
0019  * property rights.
0020  *
0021  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
0022  * copy of the source code appearing in this file ("Covered Code") an
0023  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
0024  * base code distributed originally by Intel ("Original Intel Code") to copy,
0025  * make derivatives, distribute, use and display any portion of the Covered
0026  * Code in any form, with the right to sublicense such rights; and
0027  *
0028  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
0029  * license (with the right to sublicense), under only those claims of Intel
0030  * patents that are infringed by the Original Intel Code, to make, use, sell,
0031  * offer to sell, and import the Covered Code and derivative works thereof
0032  * solely to the minimum extent necessary to exercise the above copyright
0033  * license, and in no event shall the patent license extend to any additions
0034  * to or modifications of the Original Intel Code.  No other license or right
0035  * is granted directly or by implication, estoppel or otherwise;
0036  *
0037  * The above copyright and patent license is granted only if the following
0038  * conditions are met:
0039  *
0040  * 3. Conditions
0041  *
0042  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
0043  * Redistribution of source code of any substantial portion of the Covered
0044  * Code or modification with rights to further distribute source must include
0045  * the above Copyright Notice, the above License, this list of Conditions,
0046  * and the following Disclaimer and Export Compliance provision.  In addition,
0047  * Licensee must cause all Covered Code to which Licensee contributes to
0048  * contain a file documenting the changes Licensee made to create that Covered
0049  * Code and the date of any change.  Licensee must include in that file the
0050  * documentation of any changes made by any predecessor Licensee.  Licensee
0051  * must include a prominent statement that the modification is derived,
0052  * directly or indirectly, from Original Intel Code.
0053  *
0054  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
0055  * Redistribution of source code of any substantial portion of the Covered
0056  * Code or modification without rights to further distribute source must
0057  * include the following Disclaimer and Export Compliance provision in the
0058  * documentation and/or other materials provided with distribution.  In
0059  * addition, Licensee may not authorize further sublicense of source of any
0060  * portion of the Covered Code, and must include terms to the effect that the
0061  * license from Licensee to its licensee is limited to the intellectual
0062  * property embodied in the software Licensee provides to its licensee, and
0063  * not to intellectual property embodied in modifications its licensee may
0064  * make.
0065  *
0066  * 3.3. Redistribution of Executable. Redistribution in executable form of any
0067  * substantial portion of the Covered Code or modification must reproduce the
0068  * above Copyright Notice, and the following Disclaimer and Export Compliance
0069  * provision in the documentation and/or other materials provided with the
0070  * distribution.
0071  *
0072  * 3.4. Intel retains all right, title, and interest in and to the Original
0073  * Intel Code.
0074  *
0075  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
0076  * Intel shall be used in advertising or otherwise to promote the sale, use or
0077  * other dealings in products derived from or relating to the Covered Code
0078  * without prior written authorization from Intel.
0079  *
0080  * 4. Disclaimer and Export Compliance
0081  *
0082  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
0083  * HERE.  ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
0084  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT,  ASSISTANCE,
0085  * INSTALLATION, TRAINING OR OTHER SERVICES.  INTEL WILL NOT PROVIDE ANY
0086 
0087  * UPDATES, ENHANCEMENTS OR EXTENSIONS.  INTEL SPECIFICALLY DISCLAIMS ANY
0088  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
0089  * PARTICULAR PURPOSE.
0090  *
0091  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
0092  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
0093  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
0094  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
0095  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
0096  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES.  THESE LIMITATIONS
0097  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
0098  * LIMITED REMEDY.
0099  *
0100  * 4.3. Licensee shall not export, either directly or indirectly, any of this
0101  * software or system incorporating such software without first obtaining any
0102  * required license or other approval from the U. S. Department of Commerce or
0103  * any other agency or department of the United States Government.  In the
0104  * event Licensee exports any such software from the United States or
0105  * re-exports any such software from a foreign destination, Licensee shall
0106  * ensure that the distribution and export/re-export of the software is in
0107  * compliance with all laws, regulations, orders, or other restrictions of the
0108  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
0109  * any of its subsidiaries will export/re-export any technical data, process,
0110  * software, or service, directly or indirectly, to any country for which the
0111  * United States government or any agency thereof requires an export license,
0112  * other governmental approval, or letter of assurance, without first obtaining
0113  * such license, approval or letter.
0114  *
0115  *****************************************************************************/
0116 
0117 #define __EXCREATE_C__
0118 
0119 #include "acpi.h"
0120 #include "accommon.h"
0121 #include "acinterp.h"
0122 #include "amlcode.h"
0123 #include "acnamesp.h"
0124 
0125 
0126 #define _COMPONENT          ACPI_EXECUTER
0127         ACPI_MODULE_NAME    ("excreate")
0128 
0129 
0130 #ifndef ACPI_NO_METHOD_EXECUTION
0131 /*******************************************************************************
0132  *
0133  * FUNCTION:    AcpiExCreateAlias
0134  *
0135  * PARAMETERS:  WalkState            - Current state, contains operands
0136  *
0137  * RETURN:      Status
0138  *
0139  * DESCRIPTION: Create a new named alias
0140  *
0141  ******************************************************************************/
0142 
0143 ACPI_STATUS
0144 AcpiExCreateAlias (
0145     ACPI_WALK_STATE         *WalkState)
0146 {
0147     ACPI_NAMESPACE_NODE     *TargetNode;
0148     ACPI_NAMESPACE_NODE     *AliasNode;
0149     ACPI_STATUS             Status = AE_OK;
0150 
0151 
0152     ACPI_FUNCTION_TRACE (ExCreateAlias);
0153 
0154 
0155     /* Get the source/alias operands (both namespace nodes) */
0156 
0157     AliasNode =  (ACPI_NAMESPACE_NODE *) WalkState->Operands[0];
0158     TargetNode = (ACPI_NAMESPACE_NODE *) WalkState->Operands[1];
0159 
0160     if ((TargetNode->Type == ACPI_TYPE_LOCAL_ALIAS)  ||
0161         (TargetNode->Type == ACPI_TYPE_LOCAL_METHOD_ALIAS))
0162     {
0163         /*
0164          * Dereference an existing alias so that we don't create a chain
0165          * of aliases.  With this code, we guarantee that an alias is
0166          * always exactly one level of indirection away from the
0167          * actual aliased name.
0168          */
0169         TargetNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, TargetNode->Object);
0170     }
0171 
0172     /*
0173      * For objects that can never change (i.e., the NS node will
0174      * permanently point to the same object), we can simply attach
0175      * the object to the new NS node.  For other objects (such as
0176      * Integers, buffers, etc.), we have to point the Alias node
0177      * to the original Node.
0178      */
0179     switch (TargetNode->Type)
0180     {
0181 
0182     /* For these types, the sub-object can change dynamically via a Store */
0183 
0184     case ACPI_TYPE_INTEGER:
0185     case ACPI_TYPE_STRING:
0186     case ACPI_TYPE_BUFFER:
0187     case ACPI_TYPE_PACKAGE:
0188     case ACPI_TYPE_BUFFER_FIELD:
0189 
0190     /*
0191      * These types open a new scope, so we need the NS node in order to access
0192      * any children.
0193      */
0194     case ACPI_TYPE_DEVICE:
0195     case ACPI_TYPE_POWER:
0196     case ACPI_TYPE_PROCESSOR:
0197     case ACPI_TYPE_THERMAL:
0198     case ACPI_TYPE_LOCAL_SCOPE:
0199 
0200         /*
0201          * The new alias has the type ALIAS and points to the original
0202          * NS node, not the object itself.
0203          */
0204         AliasNode->Type = ACPI_TYPE_LOCAL_ALIAS;
0205         AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
0206         break;
0207 
0208     case ACPI_TYPE_METHOD:
0209 
0210         /*
0211          * Control method aliases need to be differentiated
0212          */
0213         AliasNode->Type = ACPI_TYPE_LOCAL_METHOD_ALIAS;
0214         AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
0215         break;
0216 
0217     default:
0218 
0219         /* Attach the original source object to the new Alias Node */
0220 
0221         /*
0222          * The new alias assumes the type of the target, and it points
0223          * to the same object.  The reference count of the object has an
0224          * additional reference to prevent deletion out from under either the
0225          * target node or the alias Node
0226          */
0227         Status = AcpiNsAttachObject (AliasNode,
0228                     AcpiNsGetAttachedObject (TargetNode), TargetNode->Type);
0229         break;
0230     }
0231 
0232     /* Since both operands are Nodes, we don't need to delete them */
0233 
0234     return_ACPI_STATUS (Status);
0235 }
0236 
0237 
0238 /*******************************************************************************
0239  *
0240  * FUNCTION:    AcpiExCreateEvent
0241  *
0242  * PARAMETERS:  WalkState           - Current state
0243  *
0244  * RETURN:      Status
0245  *
0246  * DESCRIPTION: Create a new event object
0247  *
0248  ******************************************************************************/
0249 
0250 ACPI_STATUS
0251 AcpiExCreateEvent (
0252     ACPI_WALK_STATE         *WalkState)
0253 {
0254     ACPI_STATUS             Status;
0255     ACPI_OPERAND_OBJECT     *ObjDesc;
0256 
0257 
0258     ACPI_FUNCTION_TRACE (ExCreateEvent);
0259 
0260 
0261     ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_EVENT);
0262     if (!ObjDesc)
0263     {
0264         Status = AE_NO_MEMORY;
0265         goto Cleanup;
0266     }
0267 
0268     /*
0269      * Create the actual OS semaphore, with zero initial units -- meaning
0270      * that the event is created in an unsignalled state
0271      */
0272     Status = AcpiOsCreateSemaphore (ACPI_NO_UNIT_LIMIT, 0,
0273                 &ObjDesc->Event.OsSemaphore);
0274     if (ACPI_FAILURE (Status))
0275     {
0276         goto Cleanup;
0277     }
0278 
0279     /* Attach object to the Node */
0280 
0281     Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) WalkState->Operands[0],
0282                 ObjDesc, ACPI_TYPE_EVENT);
0283 
0284 Cleanup:
0285     /*
0286      * Remove local reference to the object (on error, will cause deletion
0287      * of both object and semaphore if present.)
0288      */
0289     AcpiUtRemoveReference (ObjDesc);
0290     return_ACPI_STATUS (Status);
0291 }
0292 
0293 
0294 /*******************************************************************************
0295  *
0296  * FUNCTION:    AcpiExCreateMutex
0297  *
0298  * PARAMETERS:  WalkState           - Current state
0299  *
0300  * RETURN:      Status
0301  *
0302  * DESCRIPTION: Create a new mutex object
0303  *
0304  *              Mutex (Name[0], SyncLevel[1])
0305  *
0306  ******************************************************************************/
0307 
0308 ACPI_STATUS
0309 AcpiExCreateMutex (
0310     ACPI_WALK_STATE         *WalkState)
0311 {
0312     ACPI_STATUS             Status = AE_OK;
0313     ACPI_OPERAND_OBJECT     *ObjDesc;
0314 
0315 
0316     ACPI_FUNCTION_TRACE_PTR (ExCreateMutex, ACPI_WALK_OPERANDS);
0317 
0318 
0319     /* Create the new mutex object */
0320 
0321     ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_MUTEX);
0322     if (!ObjDesc)
0323     {
0324         Status = AE_NO_MEMORY;
0325         goto Cleanup;
0326     }
0327 
0328     /* Create the actual OS Mutex */
0329 
0330     Status = AcpiOsCreateMutex (&ObjDesc->Mutex.OsMutex);
0331     if (ACPI_FAILURE (Status))
0332     {
0333         goto Cleanup;
0334     }
0335 
0336     /* Init object and attach to NS node */
0337 
0338     ObjDesc->Mutex.SyncLevel = (UINT8) WalkState->Operands[1]->Integer.Value;
0339     ObjDesc->Mutex.Node = (ACPI_NAMESPACE_NODE *) WalkState->Operands[0];
0340 
0341     Status = AcpiNsAttachObject (ObjDesc->Mutex.Node, ObjDesc, ACPI_TYPE_MUTEX);
0342 
0343 
0344 Cleanup:
0345     /*
0346      * Remove local reference to the object (on error, will cause deletion
0347      * of both object and semaphore if present.)
0348      */
0349     AcpiUtRemoveReference (ObjDesc);
0350     return_ACPI_STATUS (Status);
0351 }
0352 
0353 
0354 /*******************************************************************************
0355  *
0356  * FUNCTION:    AcpiExCreateRegion
0357  *
0358  * PARAMETERS:  AmlStart            - Pointer to the region declaration AML
0359  *              AmlLength           - Max length of the declaration AML
0360  *              RegionSpace         - SpaceID for the region
0361  *              WalkState           - Current state
0362  *
0363  * RETURN:      Status
0364  *
0365  * DESCRIPTION: Create a new operation region object
0366  *
0367  ******************************************************************************/
0368 
0369 ACPI_STATUS
0370 AcpiExCreateRegion (
0371     UINT8                   *AmlStart,
0372     UINT32                  AmlLength,
0373     UINT8                   RegionSpace,
0374     ACPI_WALK_STATE         *WalkState)
0375 {
0376     ACPI_STATUS             Status;
0377     ACPI_OPERAND_OBJECT     *ObjDesc;
0378     ACPI_NAMESPACE_NODE     *Node;
0379     ACPI_OPERAND_OBJECT     *RegionObj2;
0380 
0381 
0382     ACPI_FUNCTION_TRACE (ExCreateRegion);
0383 
0384 
0385     /* Get the Namespace Node */
0386 
0387     Node = WalkState->Op->Common.Node;
0388 
0389     /*
0390      * If the region object is already attached to this node,
0391      * just return
0392      */
0393     if (AcpiNsGetAttachedObject (Node))
0394     {
0395         return_ACPI_STATUS (AE_OK);
0396     }
0397 
0398     /*
0399      * Space ID must be one of the predefined IDs, or in the user-defined
0400      * range
0401      */
0402     if ((RegionSpace >= ACPI_NUM_PREDEFINED_REGIONS) &&
0403         (RegionSpace < ACPI_USER_REGION_BEGIN))
0404     {
0405         ACPI_ERROR ((AE_INFO, "Invalid AddressSpace type %X", RegionSpace));
0406         return_ACPI_STATUS (AE_AML_INVALID_SPACE_ID);
0407     }
0408 
0409     ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "Region Type - %s (%X)\n",
0410         AcpiUtGetRegionName (RegionSpace), RegionSpace));
0411 
0412     /* Create the region descriptor */
0413 
0414     ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION);
0415     if (!ObjDesc)
0416     {
0417         Status = AE_NO_MEMORY;
0418         goto Cleanup;
0419     }
0420 
0421     /*
0422      * Remember location in AML stream of address & length
0423      * operands since they need to be evaluated at run time.
0424      */
0425     RegionObj2 = ObjDesc->Common.NextObject;
0426     RegionObj2->Extra.AmlStart = AmlStart;
0427     RegionObj2->Extra.AmlLength = AmlLength;
0428 
0429     /* Init the region from the operands */
0430 
0431     ObjDesc->Region.SpaceId = RegionSpace;
0432     ObjDesc->Region.Address = 0;
0433     ObjDesc->Region.Length = 0;
0434     ObjDesc->Region.Node = Node;
0435 
0436     /* Install the new region object in the parent Node */
0437 
0438     Status = AcpiNsAttachObject (Node, ObjDesc, ACPI_TYPE_REGION);
0439 
0440 
0441 Cleanup:
0442 
0443     /* Remove local reference to the object */
0444 
0445     AcpiUtRemoveReference (ObjDesc);
0446     return_ACPI_STATUS (Status);
0447 }
0448 
0449 
0450 /*******************************************************************************
0451  *
0452  * FUNCTION:    AcpiExCreateProcessor
0453  *
0454  * PARAMETERS:  WalkState           - Current state
0455  *
0456  * RETURN:      Status
0457  *
0458  * DESCRIPTION: Create a new processor object and populate the fields
0459  *
0460  *              Processor (Name[0], CpuID[1], PblockAddr[2], PblockLength[3])
0461  *
0462  ******************************************************************************/
0463 
0464 ACPI_STATUS
0465 AcpiExCreateProcessor (
0466     ACPI_WALK_STATE         *WalkState)
0467 {
0468     ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
0469     ACPI_OPERAND_OBJECT     *ObjDesc;
0470     ACPI_STATUS             Status;
0471 
0472 
0473     ACPI_FUNCTION_TRACE_PTR (ExCreateProcessor, WalkState);
0474 
0475 
0476     /* Create the processor object */
0477 
0478     ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PROCESSOR);
0479     if (!ObjDesc)
0480     {
0481         return_ACPI_STATUS (AE_NO_MEMORY);
0482     }
0483 
0484     /* Initialize the processor object from the operands */
0485 
0486     ObjDesc->Processor.ProcId = (UINT8) Operand[1]->Integer.Value;
0487     ObjDesc->Processor.Length = (UINT8) Operand[3]->Integer.Value;
0488     ObjDesc->Processor.Address = (ACPI_IO_ADDRESS) Operand[2]->Integer.Value;
0489 
0490     /* Install the processor object in the parent Node */
0491 
0492     Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) Operand[0],
0493                     ObjDesc, ACPI_TYPE_PROCESSOR);
0494 
0495     /* Remove local reference to the object */
0496 
0497     AcpiUtRemoveReference (ObjDesc);
0498     return_ACPI_STATUS (Status);
0499 }
0500 
0501 
0502 /*******************************************************************************
0503  *
0504  * FUNCTION:    AcpiExCreatePowerResource
0505  *
0506  * PARAMETERS:  WalkState           - Current state
0507  *
0508  * RETURN:      Status
0509  *
0510  * DESCRIPTION: Create a new PowerResource object and populate the fields
0511  *
0512  *              PowerResource (Name[0], SystemLevel[1], ResourceOrder[2])
0513  *
0514  ******************************************************************************/
0515 
0516 ACPI_STATUS
0517 AcpiExCreatePowerResource (
0518     ACPI_WALK_STATE         *WalkState)
0519 {
0520     ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
0521     ACPI_STATUS             Status;
0522     ACPI_OPERAND_OBJECT     *ObjDesc;
0523 
0524 
0525     ACPI_FUNCTION_TRACE_PTR (ExCreatePowerResource, WalkState);
0526 
0527 
0528     /* Create the power resource object */
0529 
0530     ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_POWER);
0531     if (!ObjDesc)
0532     {
0533         return_ACPI_STATUS (AE_NO_MEMORY);
0534     }
0535 
0536     /* Initialize the power object from the operands */
0537 
0538     ObjDesc->PowerResource.SystemLevel = (UINT8) Operand[1]->Integer.Value;
0539     ObjDesc->PowerResource.ResourceOrder = (UINT16) Operand[2]->Integer.Value;
0540 
0541     /* Install the  power resource object in the parent Node */
0542 
0543     Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) Operand[0],
0544                     ObjDesc, ACPI_TYPE_POWER);
0545 
0546     /* Remove local reference to the object */
0547 
0548     AcpiUtRemoveReference (ObjDesc);
0549     return_ACPI_STATUS (Status);
0550 }
0551 #endif
0552 
0553 
0554 /*******************************************************************************
0555  *
0556  * FUNCTION:    AcpiExCreateMethod
0557  *
0558  * PARAMETERS:  AmlStart        - First byte of the method's AML
0559  *              AmlLength       - AML byte count for this method
0560  *              WalkState       - Current state
0561  *
0562  * RETURN:      Status
0563  *
0564  * DESCRIPTION: Create a new method object
0565  *
0566  ******************************************************************************/
0567 
0568 ACPI_STATUS
0569 AcpiExCreateMethod (
0570     UINT8                   *AmlStart,
0571     UINT32                  AmlLength,
0572     ACPI_WALK_STATE         *WalkState)
0573 {
0574     ACPI_OPERAND_OBJECT     **Operand = &WalkState->Operands[0];
0575     ACPI_OPERAND_OBJECT     *ObjDesc;
0576     ACPI_STATUS             Status;
0577     UINT8                   MethodFlags;
0578 
0579 
0580     ACPI_FUNCTION_TRACE_PTR (ExCreateMethod, WalkState);
0581 
0582 
0583     /* Create a new method object */
0584 
0585     ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
0586     if (!ObjDesc)
0587     {
0588        Status = AE_NO_MEMORY;
0589        goto Exit;
0590     }
0591 
0592     /* Save the method's AML pointer and length  */
0593 
0594     ObjDesc->Method.AmlStart = AmlStart;
0595     ObjDesc->Method.AmlLength = AmlLength;
0596 
0597     /*
0598      * Disassemble the method flags. Split off the Arg Count
0599      * for efficiency
0600      */
0601     MethodFlags = (UINT8) Operand[1]->Integer.Value;
0602 
0603     ObjDesc->Method.MethodFlags = (UINT8) (MethodFlags & ~AML_METHOD_ARG_COUNT);
0604     ObjDesc->Method.ParamCount = (UINT8) (MethodFlags & AML_METHOD_ARG_COUNT);
0605 
0606     /*
0607      * Get the SyncLevel. If method is serialized, a mutex will be
0608      * created for this method when it is parsed.
0609      */
0610     if (MethodFlags & AML_METHOD_SERIALIZED)
0611     {
0612         /*
0613          * ACPI 1.0: SyncLevel = 0
0614          * ACPI 2.0: SyncLevel = SyncLevel in method declaration
0615          */
0616         ObjDesc->Method.SyncLevel = (UINT8)
0617             ((MethodFlags & AML_METHOD_SYNC_LEVEL) >> 4);
0618     }
0619 
0620     /* Attach the new object to the method Node */
0621 
0622     Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) Operand[0],
0623                     ObjDesc, ACPI_TYPE_METHOD);
0624 
0625     /* Remove local reference to the object */
0626 
0627     AcpiUtRemoveReference (ObjDesc);
0628 
0629 Exit:
0630     /* Remove a reference to the operand */
0631 
0632     AcpiUtRemoveReference (Operand[1]);
0633     return_ACPI_STATUS (Status);
0634 }
0635 
0636