The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/contrib/dev/acpica/components/namespace/nssearch.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*******************************************************************************
    2  *
    3  * Module Name: nssearch - Namespace search
    4  *
    5  ******************************************************************************/
    6 
    7 /******************************************************************************
    8  *
    9  * 1. Copyright Notice
   10  *
   11  * Some or all of this work - Copyright (c) 1999 - 2022, 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  * Alternatively, you may choose to be licensed under the terms of the
  117  * following license:
  118  *
  119  * Redistribution and use in source and binary forms, with or without
  120  * modification, are permitted provided that the following conditions
  121  * are met:
  122  * 1. Redistributions of source code must retain the above copyright
  123  *    notice, this list of conditions, and the following disclaimer,
  124  *    without modification.
  125  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
  126  *    substantially similar to the "NO WARRANTY" disclaimer below
  127  *    ("Disclaimer") and any redistribution must be conditioned upon
  128  *    including a substantially similar Disclaimer requirement for further
  129  *    binary redistribution.
  130  * 3. Neither the names of the above-listed copyright holders nor the names
  131  *    of any contributors may be used to endorse or promote products derived
  132  *    from this software without specific prior written permission.
  133  *
  134  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  135  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  136  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  137  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  138  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  139  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  140  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  141  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  142  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  143  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  144  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  145  *
  146  * Alternatively, you may choose to be licensed under the terms of the
  147  * GNU General Public License ("GPL") version 2 as published by the Free
  148  * Software Foundation.
  149  *
  150  *****************************************************************************/
  151 
  152 #include <contrib/dev/acpica/include/acpi.h>
  153 #include <contrib/dev/acpica/include/accommon.h>
  154 #include <contrib/dev/acpica/include/acnamesp.h>
  155 
  156 #ifdef ACPI_ASL_COMPILER
  157 #include <contrib/dev/acpica/include/amlcode.h>
  158 #endif
  159 
  160 #define _COMPONENT          ACPI_NAMESPACE
  161         ACPI_MODULE_NAME    ("nssearch")
  162 
  163 /* Local prototypes */
  164 
  165 static ACPI_STATUS
  166 AcpiNsSearchParentTree (
  167     UINT32                  TargetName,
  168     ACPI_NAMESPACE_NODE     *Node,
  169     ACPI_OBJECT_TYPE        Type,
  170     ACPI_NAMESPACE_NODE     **ReturnNode);
  171 
  172 
  173 /*******************************************************************************
  174  *
  175  * FUNCTION:    AcpiNsSearchOneScope
  176  *
  177  * PARAMETERS:  TargetName      - Ascii ACPI name to search for
  178  *              ParentNode      - Starting node where search will begin
  179  *              Type            - Object type to match
  180  *              ReturnNode      - Where the matched Named obj is returned
  181  *
  182  * RETURN:      Status
  183  *
  184  * DESCRIPTION: Search a single level of the namespace. Performs a
  185  *              simple search of the specified level, and does not add
  186  *              entries or search parents.
  187  *
  188  *
  189  *      Named object lists are built (and subsequently dumped) in the
  190  *      order in which the names are encountered during the namespace load;
  191  *
  192  *      All namespace searching is linear in this implementation, but
  193  *      could be easily modified to support any improved search
  194  *      algorithm. However, the linear search was chosen for simplicity
  195  *      and because the trees are small and the other interpreter
  196  *      execution overhead is relatively high.
  197  *
  198  *      Note: CPU execution analysis has shown that the AML interpreter spends
  199  *      a very small percentage of its time searching the namespace. Therefore,
  200  *      the linear search seems to be sufficient, as there would seem to be
  201  *      little value in improving the search.
  202  *
  203  ******************************************************************************/
  204 
  205 ACPI_STATUS
  206 AcpiNsSearchOneScope (
  207     UINT32                  TargetName,
  208     ACPI_NAMESPACE_NODE     *ParentNode,
  209     ACPI_OBJECT_TYPE        Type,
  210     ACPI_NAMESPACE_NODE     **ReturnNode)
  211 {
  212     ACPI_NAMESPACE_NODE     *Node;
  213 
  214 
  215     ACPI_FUNCTION_TRACE (NsSearchOneScope);
  216 
  217 
  218 #ifdef ACPI_DEBUG_OUTPUT
  219     if (ACPI_LV_NAMES & AcpiDbgLevel)
  220     {
  221         char                *ScopeName;
  222 
  223         ScopeName = AcpiNsGetNormalizedPathname (ParentNode, TRUE);
  224         if (ScopeName)
  225         {
  226             ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
  227                 "Searching %s (%p) For [%4.4s] (%s)\n",
  228                 ScopeName, ParentNode, ACPI_CAST_PTR (char, &TargetName),
  229                 AcpiUtGetTypeName (Type)));
  230 
  231             ACPI_FREE (ScopeName);
  232         }
  233     }
  234 #endif
  235 
  236     /*
  237      * Search for name at this namespace level, which is to say that we
  238      * must search for the name among the children of this object
  239      */
  240     Node = ParentNode->Child;
  241     while (Node)
  242     {
  243         /* Check for match against the name */
  244 
  245         if (Node->Name.Integer == TargetName)
  246         {
  247             /* Resolve a control method alias if any */
  248 
  249             if (AcpiNsGetType (Node) == ACPI_TYPE_LOCAL_METHOD_ALIAS)
  250             {
  251                 Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Node->Object);
  252             }
  253 
  254             /* Found matching entry */
  255 
  256             ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
  257                 "Name [%4.4s] (%s) %p found in scope [%4.4s] %p\n",
  258                 ACPI_CAST_PTR (char, &TargetName),
  259                 AcpiUtGetTypeName (Node->Type),
  260                 Node, AcpiUtGetNodeName (ParentNode), ParentNode));
  261 
  262             *ReturnNode = Node;
  263             return_ACPI_STATUS (AE_OK);
  264         }
  265 
  266         /* Didn't match name, move on to the next peer object */
  267 
  268         Node = Node->Peer;
  269     }
  270 
  271     /* Searched entire namespace level, not found */
  272 
  273     ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
  274         "Name [%4.4s] (%s) not found in search in scope [%4.4s] "
  275         "%p first child %p\n",
  276         ACPI_CAST_PTR (char, &TargetName), AcpiUtGetTypeName (Type),
  277         AcpiUtGetNodeName (ParentNode), ParentNode, ParentNode->Child));
  278 
  279     return_ACPI_STATUS (AE_NOT_FOUND);
  280 }
  281 
  282 
  283 /*******************************************************************************
  284  *
  285  * FUNCTION:    AcpiNsSearchParentTree
  286  *
  287  * PARAMETERS:  TargetName      - Ascii ACPI name to search for
  288  *              Node            - Starting node where search will begin
  289  *              Type            - Object type to match
  290  *              ReturnNode      - Where the matched Node is returned
  291  *
  292  * RETURN:      Status
  293  *
  294  * DESCRIPTION: Called when a name has not been found in the current namespace
  295  *              level. Before adding it or giving up, ACPI scope rules require
  296  *              searching enclosing scopes in cases identified by AcpiNsLocal().
  297  *
  298  *              "A name is located by finding the matching name in the current
  299  *              name space, and then in the parent name space. If the parent
  300  *              name space does not contain the name, the search continues
  301  *              recursively until either the name is found or the name space
  302  *              does not have a parent (the root of the name space). This
  303  *              indicates that the name is not found" (From ACPI Specification,
  304  *              section 5.3)
  305  *
  306  ******************************************************************************/
  307 
  308 static ACPI_STATUS
  309 AcpiNsSearchParentTree (
  310     UINT32                  TargetName,
  311     ACPI_NAMESPACE_NODE     *Node,
  312     ACPI_OBJECT_TYPE        Type,
  313     ACPI_NAMESPACE_NODE     **ReturnNode)
  314 {
  315     ACPI_STATUS             Status;
  316     ACPI_NAMESPACE_NODE     *ParentNode;
  317 
  318 
  319     ACPI_FUNCTION_TRACE (NsSearchParentTree);
  320 
  321 
  322     ParentNode = Node->Parent;
  323 
  324     /*
  325      * If there is no parent (i.e., we are at the root) or type is "local",
  326      * we won't be searching the parent tree.
  327      */
  328     if (!ParentNode)
  329     {
  330         ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[%4.4s] has no parent\n",
  331             ACPI_CAST_PTR (char, &TargetName)));
  332         return_ACPI_STATUS (AE_NOT_FOUND);
  333     }
  334 
  335     if (AcpiNsLocal (Type))
  336     {
  337         ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
  338             "[%4.4s] type [%s] must be local to this scope (no parent search)\n",
  339             ACPI_CAST_PTR (char, &TargetName), AcpiUtGetTypeName (Type)));
  340         return_ACPI_STATUS (AE_NOT_FOUND);
  341     }
  342 
  343     /* Search the parent tree */
  344 
  345     ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
  346         "Searching parent [%4.4s] for [%4.4s]\n",
  347         AcpiUtGetNodeName (ParentNode), ACPI_CAST_PTR (char, &TargetName)));
  348 
  349     /* Search parents until target is found or we have backed up to the root */
  350 
  351     while (ParentNode)
  352     {
  353         /*
  354          * Search parent scope. Use TYPE_ANY because we don't care about the
  355          * object type at this point, we only care about the existence of
  356          * the actual name we are searching for. Typechecking comes later.
  357          */
  358         Status = AcpiNsSearchOneScope (
  359             TargetName, ParentNode, ACPI_TYPE_ANY, ReturnNode);
  360         if (ACPI_SUCCESS (Status))
  361         {
  362             return_ACPI_STATUS (Status);
  363         }
  364 
  365         /* Not found here, go up another level (until we reach the root) */
  366 
  367         ParentNode = ParentNode->Parent;
  368     }
  369 
  370     /* Not found in parent tree */
  371 
  372     return_ACPI_STATUS (AE_NOT_FOUND);
  373 }
  374 
  375 
  376 /*******************************************************************************
  377  *
  378  * FUNCTION:    AcpiNsSearchAndEnter
  379  *
  380  * PARAMETERS:  TargetName          - Ascii ACPI name to search for (4 chars)
  381  *              WalkState           - Current state of the walk
  382  *              Node                - Starting node where search will begin
  383  *              InterpreterMode     - Add names only in ACPI_MODE_LOAD_PASS_x.
  384  *                                    Otherwise,search only.
  385  *              Type                - Object type to match
  386  *              Flags               - Flags describing the search restrictions
  387  *              ReturnNode          - Where the Node is returned
  388  *
  389  * RETURN:      Status
  390  *
  391  * DESCRIPTION: Search for a name segment in a single namespace level,
  392  *              optionally adding it if it is not found. If the passed
  393  *              Type is not Any and the type previously stored in the
  394  *              entry was Any (i.e. unknown), update the stored type.
  395  *
  396  *              In ACPI_IMODE_EXECUTE, search only.
  397  *              In other modes, search and add if not found.
  398  *
  399  ******************************************************************************/
  400 
  401 ACPI_STATUS
  402 AcpiNsSearchAndEnter (
  403     UINT32                  TargetName,
  404     ACPI_WALK_STATE         *WalkState,
  405     ACPI_NAMESPACE_NODE     *Node,
  406     ACPI_INTERPRETER_MODE   InterpreterMode,
  407     ACPI_OBJECT_TYPE        Type,
  408     UINT32                  Flags,
  409     ACPI_NAMESPACE_NODE     **ReturnNode)
  410 {
  411     ACPI_STATUS             Status;
  412     ACPI_NAMESPACE_NODE     *NewNode;
  413 
  414 
  415     ACPI_FUNCTION_TRACE (NsSearchAndEnter);
  416 
  417 
  418     /* Parameter validation */
  419 
  420     if (!Node || !TargetName || !ReturnNode)
  421     {
  422         ACPI_ERROR ((AE_INFO,
  423             "Null parameter: Node %p Name 0x%X ReturnNode %p",
  424             Node, TargetName, ReturnNode));
  425         return_ACPI_STATUS (AE_BAD_PARAMETER);
  426     }
  427 
  428     /*
  429      * Name must consist of valid ACPI characters. We will repair the name if
  430      * necessary because we don't want to abort because of this, but we want
  431      * all namespace names to be printable. A warning message is appropriate.
  432      *
  433      * This issue came up because there are in fact machines that exhibit
  434      * this problem, and we want to be able to enable ACPI support for them,
  435      * even though there are a few bad names.
  436      */
  437     AcpiUtRepairName (ACPI_CAST_PTR (char, &TargetName));
  438 
  439     /* Try to find the name in the namespace level specified by the caller */
  440 
  441     *ReturnNode = ACPI_ENTRY_NOT_FOUND;
  442     Status = AcpiNsSearchOneScope (TargetName, Node, Type, ReturnNode);
  443     if (Status != AE_NOT_FOUND)
  444     {
  445         /*
  446          * If we found it AND the request specifies that a find is an error,
  447          * return the error
  448          */
  449         if (Status == AE_OK)
  450         {
  451             /* The node was found in the namespace */
  452 
  453             /*
  454              * If the namespace override feature is enabled for this node,
  455              * delete any existing attached sub-object and make the node
  456              * look like a new node that is owned by the override table.
  457              */
  458             if (Flags & ACPI_NS_OVERRIDE_IF_FOUND)
  459             {
  460                 ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
  461                     "Namespace override: %4.4s pass %u type %X Owner %X\n",
  462                     ACPI_CAST_PTR(char, &TargetName), InterpreterMode,
  463                     (*ReturnNode)->Type, WalkState->OwnerId));
  464 
  465                 AcpiNsDeleteChildren (*ReturnNode);
  466                 if (AcpiGbl_RuntimeNamespaceOverride)
  467                 {
  468                     AcpiUtRemoveReference ((*ReturnNode)->Object);
  469                     (*ReturnNode)->Object = NULL;
  470                     (*ReturnNode)->OwnerId = WalkState->OwnerId;
  471                 }
  472                 else
  473                 {
  474                     AcpiNsRemoveNode (*ReturnNode);
  475                     *ReturnNode = ACPI_ENTRY_NOT_FOUND;
  476                 }
  477             }
  478 
  479             /* Return an error if we don't expect to find the object */
  480 
  481             else if (Flags & ACPI_NS_ERROR_IF_FOUND)
  482             {
  483                 Status = AE_ALREADY_EXISTS;
  484             }
  485         }
  486 
  487 #ifdef ACPI_ASL_COMPILER
  488         if (*ReturnNode && (*ReturnNode)->Type == ACPI_TYPE_ANY)
  489         {
  490             (*ReturnNode)->Flags |= ANOBJ_IS_EXTERNAL;
  491         }
  492 #endif
  493 
  494         /* Either found it or there was an error: finished either way */
  495 
  496         return_ACPI_STATUS (Status);
  497     }
  498 
  499     /*
  500      * The name was not found. If we are NOT performing the first pass
  501      * (name entry) of loading the namespace, search the parent tree (all the
  502      * way to the root if necessary.) We don't want to perform the parent
  503      * search when the namespace is actually being loaded. We want to perform
  504      * the search when namespace references are being resolved (load pass 2)
  505      * and during the execution phase.
  506      */
  507     if ((InterpreterMode != ACPI_IMODE_LOAD_PASS1) &&
  508         (Flags & ACPI_NS_SEARCH_PARENT))
  509     {
  510         /*
  511          * Not found at this level - search parent tree according to the
  512          * ACPI specification
  513          */
  514         Status = AcpiNsSearchParentTree (TargetName, Node, Type, ReturnNode);
  515         if (ACPI_SUCCESS (Status))
  516         {
  517             return_ACPI_STATUS (Status);
  518         }
  519     }
  520 
  521     /* In execute mode, just search, never add names. Exit now */
  522 
  523     if (InterpreterMode == ACPI_IMODE_EXECUTE)
  524     {
  525         ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
  526             "%4.4s Not found in %p [Not adding]\n",
  527             ACPI_CAST_PTR (char, &TargetName), Node));
  528 
  529         return_ACPI_STATUS (AE_NOT_FOUND);
  530     }
  531 
  532     /* Create the new named object */
  533 
  534     NewNode = AcpiNsCreateNode (TargetName);
  535     if (!NewNode)
  536     {
  537         return_ACPI_STATUS (AE_NO_MEMORY);
  538     }
  539 
  540 #ifdef ACPI_ASL_COMPILER
  541 
  542     /* Node is an object defined by an External() statement */
  543 
  544     if (Flags & ACPI_NS_EXTERNAL ||
  545         (WalkState && WalkState->Opcode == AML_SCOPE_OP))
  546     {
  547         NewNode->Flags |= ANOBJ_IS_EXTERNAL;
  548     }
  549 #endif
  550 
  551     if (Flags & ACPI_NS_TEMPORARY)
  552     {
  553         NewNode->Flags |= ANOBJ_TEMPORARY;
  554     }
  555 
  556     /* Install the new object into the parent's list of children */
  557 
  558     AcpiNsInstallNode (WalkState, Node, NewNode, Type);
  559     *ReturnNode = NewNode;
  560     return_ACPI_STATUS (AE_OK);
  561 }

Cache object: c2089905ce9303f6d4619bf4dae63214


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.