Home | History | Annotate | Line # | Download | only in namespace
      1 /*******************************************************************************
      2  *
      3  * Module Name: nsobject - Utilities for objects attached to namespace
      4  *                         table entries
      5  *
      6  ******************************************************************************/
      7 
      8 /******************************************************************************
      9  *
     10  * 1. Copyright Notice
     11  *
     12  * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
     13  * All rights reserved.
     14  *
     15  * 2. License
     16  *
     17  * 2.1. This is your license from Intel Corp. under its intellectual property
     18  * rights. You may have additional license terms from the party that provided
     19  * you this software, covering your right to use that party's intellectual
     20  * property rights.
     21  *
     22  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
     23  * copy of the source code appearing in this file ("Covered Code") an
     24  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
     25  * base code distributed originally by Intel ("Original Intel Code") to copy,
     26  * make derivatives, distribute, use and display any portion of the Covered
     27  * Code in any form, with the right to sublicense such rights; and
     28  *
     29  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
     30  * license (with the right to sublicense), under only those claims of Intel
     31  * patents that are infringed by the Original Intel Code, to make, use, sell,
     32  * offer to sell, and import the Covered Code and derivative works thereof
     33  * solely to the minimum extent necessary to exercise the above copyright
     34  * license, and in no event shall the patent license extend to any additions
     35  * to or modifications of the Original Intel Code. No other license or right
     36  * is granted directly or by implication, estoppel or otherwise;
     37  *
     38  * The above copyright and patent license is granted only if the following
     39  * conditions are met:
     40  *
     41  * 3. Conditions
     42  *
     43  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
     44  * Redistribution of source code of any substantial portion of the Covered
     45  * Code or modification with rights to further distribute source must include
     46  * the above Copyright Notice, the above License, this list of Conditions,
     47  * and the following Disclaimer and Export Compliance provision. In addition,
     48  * Licensee must cause all Covered Code to which Licensee contributes to
     49  * contain a file documenting the changes Licensee made to create that Covered
     50  * Code and the date of any change. Licensee must include in that file the
     51  * documentation of any changes made by any predecessor Licensee. Licensee
     52  * must include a prominent statement that the modification is derived,
     53  * directly or indirectly, from Original Intel Code.
     54  *
     55  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
     56  * Redistribution of source code of any substantial portion of the Covered
     57  * Code or modification without rights to further distribute source must
     58  * include the following Disclaimer and Export Compliance provision in the
     59  * documentation and/or other materials provided with distribution. In
     60  * addition, Licensee may not authorize further sublicense of source of any
     61  * portion of the Covered Code, and must include terms to the effect that the
     62  * license from Licensee to its licensee is limited to the intellectual
     63  * property embodied in the software Licensee provides to its licensee, and
     64  * not to intellectual property embodied in modifications its licensee may
     65  * make.
     66  *
     67  * 3.3. Redistribution of Executable. Redistribution in executable form of any
     68  * substantial portion of the Covered Code or modification must reproduce the
     69  * above Copyright Notice, and the following Disclaimer and Export Compliance
     70  * provision in the documentation and/or other materials provided with the
     71  * distribution.
     72  *
     73  * 3.4. Intel retains all right, title, and interest in and to the Original
     74  * Intel Code.
     75  *
     76  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
     77  * Intel shall be used in advertising or otherwise to promote the sale, use or
     78  * other dealings in products derived from or relating to the Covered Code
     79  * without prior written authorization from Intel.
     80  *
     81  * 4. Disclaimer and Export Compliance
     82  *
     83  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
     84  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
     85  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
     86  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
     87  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
     88  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
     89  * PARTICULAR PURPOSE.
     90  *
     91  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
     92  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
     93  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
     94  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
     95  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
     96  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
     97  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
     98  * LIMITED REMEDY.
     99  *
    100  * 4.3. Licensee shall not export, either directly or indirectly, any of this
    101  * software or system incorporating such software without first obtaining any
    102  * required license or other approval from the U. S. Department of Commerce or
    103  * any other agency or department of the United States Government. In the
    104  * event Licensee exports any such software from the United States or
    105  * re-exports any such software from a foreign destination, Licensee shall
    106  * ensure that the distribution and export/re-export of the software is in
    107  * compliance with all laws, regulations, orders, or other restrictions of the
    108  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
    109  * any of its subsidiaries will export/re-export any technical data, process,
    110  * software, or service, directly or indirectly, to any country for which the
    111  * United States government or any agency thereof requires an export license,
    112  * other governmental approval, or letter of assurance, without first obtaining
    113  * such license, approval or letter.
    114  *
    115  *****************************************************************************
    116  *
    117  * Alternatively, you may choose to be licensed under the terms of the
    118  * following license:
    119  *
    120  * Redistribution and use in source and binary forms, with or without
    121  * modification, are permitted provided that the following conditions
    122  * are met:
    123  * 1. Redistributions of source code must retain the above copyright
    124  *    notice, this list of conditions, and the following disclaimer,
    125  *    without modification.
    126  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
    127  *    substantially similar to the "NO WARRANTY" disclaimer below
    128  *    ("Disclaimer") and any redistribution must be conditioned upon
    129  *    including a substantially similar Disclaimer requirement for further
    130  *    binary redistribution.
    131  * 3. Neither the names of the above-listed copyright holders nor the names
    132  *    of any contributors may be used to endorse or promote products derived
    133  *    from this software without specific prior written permission.
    134  *
    135  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    136  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    137  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    138  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    139  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    140  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    141  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    142  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    143  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    144  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    145  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    146  *
    147  * Alternatively, you may choose to be licensed under the terms of the
    148  * GNU General Public License ("GPL") version 2 as published by the Free
    149  * Software Foundation.
    150  *
    151  *****************************************************************************/
    152 
    153 #include "acpi.h"
    154 #include "accommon.h"
    155 #include "acnamesp.h"
    156 
    157 
    158 #define _COMPONENT          ACPI_NAMESPACE
    159         ACPI_MODULE_NAME    ("nsobject")
    160 
    161 
    162 /*******************************************************************************
    163  *
    164  * FUNCTION:    AcpiNsAttachObject
    165  *
    166  * PARAMETERS:  Node                - Parent Node
    167  *              Object              - Object to be attached
    168  *              Type                - Type of object, or ACPI_TYPE_ANY if not
    169  *                                    known
    170  *
    171  * RETURN:      Status
    172  *
    173  * DESCRIPTION: Record the given object as the value associated with the
    174  *              name whose ACPI_HANDLE is passed. If Object is NULL
    175  *              and Type is ACPI_TYPE_ANY, set the name as having no value.
    176  *              Note: Future may require that the Node->Flags field be passed
    177  *              as a parameter.
    178  *
    179  * MUTEX:       Assumes namespace is locked
    180  *
    181  ******************************************************************************/
    182 
    183 ACPI_STATUS
    184 AcpiNsAttachObject (
    185     ACPI_NAMESPACE_NODE     *Node,
    186     ACPI_OPERAND_OBJECT     *Object,
    187     ACPI_OBJECT_TYPE        Type)
    188 {
    189     ACPI_OPERAND_OBJECT     *ObjDesc;
    190     ACPI_OPERAND_OBJECT     *LastObjDesc;
    191     ACPI_OBJECT_TYPE        ObjectType = ACPI_TYPE_ANY;
    192 
    193 
    194     ACPI_FUNCTION_TRACE (NsAttachObject);
    195 
    196 
    197     /*
    198      * Parameter validation
    199      */
    200     if (!Node)
    201     {
    202         /* Invalid handle */
    203 
    204         ACPI_ERROR ((AE_INFO, "Null NamedObj handle"));
    205         return_ACPI_STATUS (AE_BAD_PARAMETER);
    206     }
    207 
    208     if (!Object && (ACPI_TYPE_ANY != Type))
    209     {
    210         /* Null object */
    211 
    212         ACPI_ERROR ((AE_INFO,
    213             "Null object, but type not ACPI_TYPE_ANY"));
    214         return_ACPI_STATUS (AE_BAD_PARAMETER);
    215     }
    216 
    217     if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
    218     {
    219         /* Not a name handle */
    220 
    221         ACPI_ERROR ((AE_INFO, "Invalid handle %p [%s]",
    222             Node, AcpiUtGetDescriptorName (Node)));
    223         return_ACPI_STATUS (AE_BAD_PARAMETER);
    224     }
    225 
    226     /* Check if this object is already attached */
    227 
    228     if (Node->Object == Object)
    229     {
    230         ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
    231             "Obj %p already installed in NameObj %p\n",
    232             Object, Node));
    233 
    234         return_ACPI_STATUS (AE_OK);
    235     }
    236 
    237     /* If null object, we will just install it */
    238 
    239     if (!Object)
    240     {
    241         ObjDesc    = NULL;
    242         ObjectType = ACPI_TYPE_ANY;
    243     }
    244 
    245     /*
    246      * If the source object is a namespace Node with an attached object,
    247      * we will use that (attached) object
    248      */
    249     else if ((ACPI_GET_DESCRIPTOR_TYPE (Object) == ACPI_DESC_TYPE_NAMED) &&
    250             ((ACPI_NAMESPACE_NODE *) Object)->Object)
    251     {
    252         /*
    253          * Value passed is a name handle and that name has a
    254          * non-null value. Use that name's value and type.
    255          */
    256         ObjDesc = ((ACPI_NAMESPACE_NODE *) Object)->Object;
    257         ObjectType = ((ACPI_NAMESPACE_NODE *) Object)->Type;
    258     }
    259 
    260     /*
    261      * Otherwise, we will use the parameter object, but we must type
    262      * it first
    263      */
    264     else
    265     {
    266         ObjDesc = (ACPI_OPERAND_OBJECT  *) Object;
    267 
    268         /* Use the given type */
    269 
    270         ObjectType = Type;
    271     }
    272 
    273     ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Installing %p into Node %p [%4.4s]\n",
    274         ObjDesc, Node, AcpiUtGetNodeName (Node)));
    275 
    276     /* Detach an existing attached object if present */
    277 
    278     if (Node->Object)
    279     {
    280         AcpiNsDetachObject (Node);
    281     }
    282 
    283     if (ObjDesc)
    284     {
    285         /*
    286          * Must increment the new value's reference count
    287          * (if it is an internal object)
    288          */
    289         AcpiUtAddReference (ObjDesc);
    290 
    291         /*
    292          * Handle objects with multiple descriptors - walk
    293          * to the end of the descriptor list
    294          */
    295         LastObjDesc = ObjDesc;
    296         while (LastObjDesc->Common.NextObject)
    297         {
    298             LastObjDesc = LastObjDesc->Common.NextObject;
    299         }
    300 
    301         /* Install the object at the front of the object list */
    302 
    303         LastObjDesc->Common.NextObject = Node->Object;
    304     }
    305 
    306     Node->Type = (UINT8) ObjectType;
    307     Node->Object = ObjDesc;
    308 
    309     return_ACPI_STATUS (AE_OK);
    310 }
    311 
    312 
    313 /*******************************************************************************
    314  *
    315  * FUNCTION:    AcpiNsDetachObject
    316  *
    317  * PARAMETERS:  Node           - A Namespace node whose object will be detached
    318  *
    319  * RETURN:      None.
    320  *
    321  * DESCRIPTION: Detach/delete an object associated with a namespace node.
    322  *              if the object is an allocated object, it is freed.
    323  *              Otherwise, the field is simply cleared.
    324  *
    325  ******************************************************************************/
    326 
    327 void
    328 AcpiNsDetachObject (
    329     ACPI_NAMESPACE_NODE     *Node)
    330 {
    331     ACPI_OPERAND_OBJECT     *ObjDesc;
    332 
    333 
    334     ACPI_FUNCTION_TRACE (NsDetachObject);
    335 
    336 
    337     ObjDesc = Node->Object;
    338 
    339     if (!ObjDesc ||
    340         (ObjDesc->Common.Type == ACPI_TYPE_LOCAL_DATA))
    341     {
    342         return_VOID;
    343     }
    344 
    345     if (Node->Flags & ANOBJ_ALLOCATED_BUFFER)
    346     {
    347         /* Free the dynamic aml buffer */
    348 
    349         if (ObjDesc->Common.Type == ACPI_TYPE_METHOD)
    350         {
    351             ACPI_FREE (ObjDesc->Method.AmlStart);
    352         }
    353     }
    354 
    355     if (ObjDesc->Common.Type == ACPI_TYPE_REGION)
    356     {
    357         AcpiUtRemoveAddressRange(ObjDesc->Region.SpaceId, Node);
    358     }
    359 
    360     /* Clear the Node entry in all cases */
    361 
    362     Node->Object = NULL;
    363     if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND)
    364     {
    365         /* Unlink object from front of possible object list */
    366 
    367         Node->Object = ObjDesc->Common.NextObject;
    368 
    369         /* Handle possible 2-descriptor object */
    370 
    371         if (Node->Object &&
    372            (Node->Object->Common.Type != ACPI_TYPE_LOCAL_DATA))
    373         {
    374             Node->Object = Node->Object->Common.NextObject;
    375         }
    376 
    377         /*
    378          * Detach the object from any data objects (which are still held by
    379          * the namespace node)
    380          */
    381         if (ObjDesc->Common.NextObject &&
    382            ((ObjDesc->Common.NextObject)->Common.Type == ACPI_TYPE_LOCAL_DATA))
    383         {
    384            ObjDesc->Common.NextObject = NULL;
    385         }
    386     }
    387 
    388     /* Reset the node type to untyped */
    389 
    390     Node->Type = ACPI_TYPE_ANY;
    391 
    392     ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Node %p [%4.4s] Object %p\n",
    393         Node, AcpiUtGetNodeName (Node), ObjDesc));
    394 
    395     /* Remove one reference on the object (and all subobjects) */
    396 
    397     AcpiUtRemoveReference (ObjDesc);
    398     return_VOID;
    399 }
    400 
    401 
    402 /*******************************************************************************
    403  *
    404  * FUNCTION:    AcpiNsGetAttachedObject
    405  *
    406  * PARAMETERS:  Node             - Namespace node
    407  *
    408  * RETURN:      Current value of the object field from the Node whose
    409  *              handle is passed
    410  *
    411  * DESCRIPTION: Obtain the object attached to a namespace node.
    412  *
    413  ******************************************************************************/
    414 
    415 ACPI_OPERAND_OBJECT *
    416 AcpiNsGetAttachedObject (
    417     ACPI_NAMESPACE_NODE     *Node)
    418 {
    419     ACPI_FUNCTION_TRACE_PTR (NsGetAttachedObject, Node);
    420 
    421 
    422     if (!Node)
    423     {
    424         ACPI_WARNING ((AE_INFO, "Null Node ptr"));
    425         return_PTR (NULL);
    426     }
    427 
    428     if (!Node->Object ||
    429             ((ACPI_GET_DESCRIPTOR_TYPE (Node->Object) != ACPI_DESC_TYPE_OPERAND) &&
    430              (ACPI_GET_DESCRIPTOR_TYPE (Node->Object) != ACPI_DESC_TYPE_NAMED))  ||
    431         ((Node->Object)->Common.Type == ACPI_TYPE_LOCAL_DATA))
    432     {
    433         return_PTR (NULL);
    434     }
    435 
    436     return_PTR (Node->Object);
    437 }
    438 
    439 
    440 /*******************************************************************************
    441  *
    442  * FUNCTION:    AcpiNsGetSecondaryObject
    443  *
    444  * PARAMETERS:  Node             - Namespace node
    445  *
    446  * RETURN:      Current value of the object field from the Node whose
    447  *              handle is passed.
    448  *
    449  * DESCRIPTION: Obtain a secondary object associated with a namespace node.
    450  *
    451  ******************************************************************************/
    452 
    453 ACPI_OPERAND_OBJECT *
    454 AcpiNsGetSecondaryObject (
    455     ACPI_OPERAND_OBJECT     *ObjDesc)
    456 {
    457     ACPI_FUNCTION_TRACE_PTR (NsGetSecondaryObject, ObjDesc);
    458 
    459 
    460     if ((!ObjDesc)                                     ||
    461         (ObjDesc->Common.Type== ACPI_TYPE_LOCAL_DATA)  ||
    462         (!ObjDesc->Common.NextObject)                  ||
    463         ((ObjDesc->Common.NextObject)->Common.Type == ACPI_TYPE_LOCAL_DATA))
    464     {
    465         return_PTR (NULL);
    466     }
    467 
    468     return_PTR (ObjDesc->Common.NextObject);
    469 }
    470 
    471 
    472 /*******************************************************************************
    473  *
    474  * FUNCTION:    AcpiNsAttachData
    475  *
    476  * PARAMETERS:  Node            - Namespace node
    477  *              Handler         - Handler to be associated with the data
    478  *              Data            - Data to be attached
    479  *
    480  * RETURN:      Status
    481  *
    482  * DESCRIPTION: Low-level attach data. Create and attach a Data object.
    483  *
    484  ******************************************************************************/
    485 
    486 ACPI_STATUS
    487 AcpiNsAttachData (
    488     ACPI_NAMESPACE_NODE     *Node,
    489     ACPI_OBJECT_HANDLER     Handler,
    490     void                    *Data)
    491 {
    492     ACPI_OPERAND_OBJECT     *PrevObjDesc;
    493     ACPI_OPERAND_OBJECT     *ObjDesc;
    494     ACPI_OPERAND_OBJECT     *DataDesc;
    495 
    496 
    497     /* We only allow one attachment per handler */
    498 
    499     PrevObjDesc = NULL;
    500     ObjDesc = Node->Object;
    501     while (ObjDesc)
    502     {
    503         if ((ObjDesc->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
    504             (ObjDesc->Data.Handler == Handler))
    505         {
    506             return (AE_ALREADY_EXISTS);
    507         }
    508 
    509         PrevObjDesc = ObjDesc;
    510         ObjDesc = ObjDesc->Common.NextObject;
    511     }
    512 
    513     /* Create an internal object for the data */
    514 
    515     DataDesc = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_DATA);
    516     if (!DataDesc)
    517     {
    518         return (AE_NO_MEMORY);
    519     }
    520 
    521     DataDesc->Data.Handler = Handler;
    522     DataDesc->Data.Pointer = Data;
    523 
    524     /* Install the data object */
    525 
    526     if (PrevObjDesc)
    527     {
    528         PrevObjDesc->Common.NextObject = DataDesc;
    529     }
    530     else
    531     {
    532         Node->Object = DataDesc;
    533     }
    534 
    535     return (AE_OK);
    536 }
    537 
    538 
    539 /*******************************************************************************
    540  *
    541  * FUNCTION:    AcpiNsDetachData
    542  *
    543  * PARAMETERS:  Node            - Namespace node
    544  *              Handler         - Handler associated with the data
    545  *
    546  * RETURN:      Status
    547  *
    548  * DESCRIPTION: Low-level detach data. Delete the data node, but the caller
    549  *              is responsible for the actual data.
    550  *
    551  ******************************************************************************/
    552 
    553 ACPI_STATUS
    554 AcpiNsDetachData (
    555     ACPI_NAMESPACE_NODE     *Node,
    556     ACPI_OBJECT_HANDLER     Handler)
    557 {
    558     ACPI_OPERAND_OBJECT     *ObjDesc;
    559     ACPI_OPERAND_OBJECT     *PrevObjDesc;
    560 
    561 
    562     PrevObjDesc = NULL;
    563     ObjDesc = Node->Object;
    564     while (ObjDesc)
    565     {
    566         if ((ObjDesc->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
    567             (ObjDesc->Data.Handler == Handler))
    568         {
    569             if (PrevObjDesc)
    570             {
    571                 PrevObjDesc->Common.NextObject = ObjDesc->Common.NextObject;
    572             }
    573             else
    574             {
    575                 Node->Object = ObjDesc->Common.NextObject;
    576             }
    577 
    578             AcpiUtRemoveReference (ObjDesc);
    579             return (AE_OK);
    580         }
    581 
    582         PrevObjDesc = ObjDesc;
    583         ObjDesc = ObjDesc->Common.NextObject;
    584     }
    585 
    586     return (AE_NOT_FOUND);
    587 }
    588 
    589 
    590 /*******************************************************************************
    591  *
    592  * FUNCTION:    AcpiNsGetAttachedData
    593  *
    594  * PARAMETERS:  Node            - Namespace node
    595  *              Handler         - Handler associated with the data
    596  *              Data            - Where the data is returned
    597  *
    598  * RETURN:      Status
    599  *
    600  * DESCRIPTION: Low level interface to obtain data previously associated with
    601  *              a namespace node.
    602  *
    603  ******************************************************************************/
    604 
    605 ACPI_STATUS
    606 AcpiNsGetAttachedData (
    607     ACPI_NAMESPACE_NODE     *Node,
    608     ACPI_OBJECT_HANDLER     Handler,
    609     void                    **Data)
    610 {
    611     ACPI_OPERAND_OBJECT     *ObjDesc;
    612 
    613 
    614     ObjDesc = Node->Object;
    615     while (ObjDesc)
    616     {
    617         if ((ObjDesc->Common.Type == ACPI_TYPE_LOCAL_DATA) &&
    618             (ObjDesc->Data.Handler == Handler))
    619         {
    620             *Data = ObjDesc->Data.Pointer;
    621             return (AE_OK);
    622         }
    623 
    624         ObjDesc = ObjDesc->Common.NextObject;
    625     }
    626 
    627     return (AE_NOT_FOUND);
    628 }
    629