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/executer/exnames.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: exnames - interpreter/scanner name load/execute
    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/acinterp.h>
  155 #include <contrib/dev/acpica/include/amlcode.h>
  156 
  157 #define _COMPONENT          ACPI_EXECUTER
  158         ACPI_MODULE_NAME    ("exnames")
  159 
  160 /* Local prototypes */
  161 
  162 static char *
  163 AcpiExAllocateNameString (
  164     UINT32                  PrefixCount,
  165     UINT32                  NumNameSegs);
  166 
  167 static ACPI_STATUS
  168 AcpiExNameSegment (
  169     UINT8                   **InAmlAddress,
  170     char                    *NameString);
  171 
  172 
  173 /*******************************************************************************
  174  *
  175  * FUNCTION:    AcpiExAllocateNameString
  176  *
  177  * PARAMETERS:  PrefixCount         - Count of parent levels. Special cases:
  178  *                                    (-1)==root,  0==none
  179  *              NumNameSegs         - count of 4-character name segments
  180  *
  181  * RETURN:      A pointer to the allocated string segment. This segment must
  182  *              be deleted by the caller.
  183  *
  184  * DESCRIPTION: Allocate a buffer for a name string. Ensure allocated name
  185  *              string is long enough, and set up prefix if any.
  186  *
  187  ******************************************************************************/
  188 
  189 static char *
  190 AcpiExAllocateNameString (
  191     UINT32                  PrefixCount,
  192     UINT32                  NumNameSegs)
  193 {
  194     char                    *TempPtr;
  195     char                    *NameString;
  196     UINT32                   SizeNeeded;
  197 
  198     ACPI_FUNCTION_TRACE (ExAllocateNameString);
  199 
  200 
  201     /*
  202      * Allow room for all \ and ^ prefixes, all segments and a MultiNamePrefix.
  203      * Also, one byte for the null terminator.
  204      * This may actually be somewhat longer than needed.
  205      */
  206     if (PrefixCount == ACPI_UINT32_MAX)
  207     {
  208         /* Special case for root */
  209 
  210         SizeNeeded = 1 + (ACPI_NAMESEG_SIZE * NumNameSegs) + 2 + 1;
  211     }
  212     else
  213     {
  214         SizeNeeded = PrefixCount + (ACPI_NAMESEG_SIZE * NumNameSegs) + 2 + 1;
  215     }
  216 
  217     /*
  218      * Allocate a buffer for the name.
  219      * This buffer must be deleted by the caller!
  220      */
  221     NameString = ACPI_ALLOCATE (SizeNeeded);
  222     if (!NameString)
  223     {
  224         ACPI_ERROR ((AE_INFO,
  225             "Could not allocate size %u", SizeNeeded));
  226         return_PTR (NULL);
  227     }
  228 
  229     TempPtr = NameString;
  230 
  231     /* Set up Root or Parent prefixes if needed */
  232 
  233     if (PrefixCount == ACPI_UINT32_MAX)
  234     {
  235         *TempPtr++ = AML_ROOT_PREFIX;
  236     }
  237     else
  238     {
  239         while (PrefixCount--)
  240         {
  241             *TempPtr++ = AML_PARENT_PREFIX;
  242         }
  243     }
  244 
  245 
  246     /* Set up Dual or Multi prefixes if needed */
  247 
  248     if (NumNameSegs > 2)
  249     {
  250         /* Set up multi prefixes   */
  251 
  252         *TempPtr++ = AML_MULTI_NAME_PREFIX;
  253         *TempPtr++ = (char) NumNameSegs;
  254     }
  255     else if (2 == NumNameSegs)
  256     {
  257         /* Set up dual prefixes */
  258 
  259         *TempPtr++ = AML_DUAL_NAME_PREFIX;
  260     }
  261 
  262     /*
  263      * Terminate string following prefixes. AcpiExNameSegment() will
  264      * append the segment(s)
  265      */
  266     *TempPtr = 0;
  267 
  268     return_PTR (NameString);
  269 }
  270 
  271 
  272 /*******************************************************************************
  273  *
  274  * FUNCTION:    AcpiExNameSegment
  275  *
  276  * PARAMETERS:  InAmlAddress    - Pointer to the name in the AML code
  277  *              NameString      - Where to return the name. The name is appended
  278  *                                to any existing string to form a namepath
  279  *
  280  * RETURN:      Status
  281  *
  282  * DESCRIPTION: Extract an ACPI name (4 bytes) from the AML byte stream
  283  *
  284  ******************************************************************************/
  285 
  286 static ACPI_STATUS
  287 AcpiExNameSegment (
  288     UINT8                   **InAmlAddress,
  289     char                    *NameString)
  290 {
  291     char                    *AmlAddress = (void *) *InAmlAddress;
  292     ACPI_STATUS             Status = AE_OK;
  293     UINT32                  Index;
  294     char                    CharBuf[5];
  295 
  296 
  297     ACPI_FUNCTION_TRACE (ExNameSegment);
  298 
  299 
  300     /*
  301      * If first character is a digit, then we know that we aren't looking
  302      * at a valid name segment
  303      */
  304     CharBuf[0] = *AmlAddress;
  305 
  306     if ('' <= CharBuf[0] && CharBuf[0] <= '9')
  307     {
  308         ACPI_ERROR ((AE_INFO, "Invalid leading digit: %c", CharBuf[0]));
  309         return_ACPI_STATUS (AE_CTRL_PENDING);
  310     }
  311 
  312     for (Index = 0;
  313         (Index < ACPI_NAMESEG_SIZE) && (AcpiUtValidNameChar (*AmlAddress, 0));
  314         Index++)
  315     {
  316         CharBuf[Index] = *AmlAddress++;
  317     }
  318 
  319 
  320     /* Valid name segment  */
  321 
  322     if (Index == 4)
  323     {
  324         /* Found 4 valid characters */
  325 
  326         CharBuf[4] = '\0';
  327 
  328         if (NameString)
  329         {
  330             ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
  331                 "Appending NameSeg %s\n", CharBuf));
  332             strcat (NameString, CharBuf);
  333         }
  334         else
  335         {
  336             ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
  337                 "No Name string - %s\n", CharBuf));
  338         }
  339     }
  340     else if (Index == 0)
  341     {
  342         /*
  343          * First character was not a valid name character,
  344          * so we are looking at something other than a name.
  345          */
  346         ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
  347             "Leading character is not alpha: %02Xh (not a name)\n",
  348             CharBuf[0]));
  349         Status = AE_CTRL_PENDING;
  350     }
  351     else
  352     {
  353         /*
  354          * Segment started with one or more valid characters, but fewer than
  355          * the required 4
  356          */
  357         Status = AE_AML_BAD_NAME;
  358         ACPI_ERROR ((AE_INFO,
  359             "Bad character 0x%02x in name, at %p",
  360             *AmlAddress, AmlAddress));
  361     }
  362 
  363     *InAmlAddress = ACPI_CAST_PTR (UINT8, AmlAddress);
  364     return_ACPI_STATUS (Status);
  365 }
  366 
  367 
  368 /*******************************************************************************
  369  *
  370  * FUNCTION:    AcpiExGetNameString
  371  *
  372  * PARAMETERS:  DataType            - Object type to be associated with this
  373  *                                    name
  374  *              InAmlAddress        - Pointer to the namestring in the AML code
  375  *              OutNameString       - Where the namestring is returned
  376  *              OutNameLength       - Length of the returned string
  377  *
  378  * RETURN:      Status, namestring and length
  379  *
  380  * DESCRIPTION: Extract a full namepath from the AML byte stream,
  381  *              including any prefixes.
  382  *
  383  ******************************************************************************/
  384 
  385 ACPI_STATUS
  386 AcpiExGetNameString (
  387     ACPI_OBJECT_TYPE        DataType,
  388     UINT8                   *InAmlAddress,
  389     char                    **OutNameString,
  390     UINT32                  *OutNameLength)
  391 {
  392     ACPI_STATUS             Status = AE_OK;
  393     UINT8                   *AmlAddress = InAmlAddress;
  394     char                    *NameString = NULL;
  395     UINT32                  NumSegments;
  396     UINT32                  PrefixCount = 0;
  397     BOOLEAN                 HasPrefix = FALSE;
  398 
  399 
  400     ACPI_FUNCTION_TRACE_PTR (ExGetNameString, AmlAddress);
  401 
  402 
  403     if (ACPI_TYPE_LOCAL_REGION_FIELD == DataType   ||
  404         ACPI_TYPE_LOCAL_BANK_FIELD == DataType     ||
  405         ACPI_TYPE_LOCAL_INDEX_FIELD == DataType)
  406     {
  407         /* Disallow prefixes for types associated with FieldUnit names */
  408 
  409         NameString = AcpiExAllocateNameString (0, 1);
  410         if (!NameString)
  411         {
  412             Status = AE_NO_MEMORY;
  413         }
  414         else
  415         {
  416             Status = AcpiExNameSegment (&AmlAddress, NameString);
  417         }
  418     }
  419     else
  420     {
  421         /*
  422          * DataType is not a field name.
  423          * Examine first character of name for root or parent prefix operators
  424          */
  425         switch (*AmlAddress)
  426         {
  427         case AML_ROOT_PREFIX:
  428 
  429             ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "RootPrefix(\\) at %p\n",
  430                 AmlAddress));
  431 
  432             /*
  433              * Remember that we have a RootPrefix --
  434              * see comment in AcpiExAllocateNameString()
  435              */
  436             AmlAddress++;
  437             PrefixCount = ACPI_UINT32_MAX;
  438             HasPrefix = TRUE;
  439             break;
  440 
  441         case AML_PARENT_PREFIX:
  442 
  443             /* Increment past possibly multiple parent prefixes */
  444 
  445             do
  446             {
  447                 ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "ParentPrefix (^) at %p\n",
  448                     AmlAddress));
  449 
  450                 AmlAddress++;
  451                 PrefixCount++;
  452 
  453             } while (*AmlAddress == AML_PARENT_PREFIX);
  454 
  455             HasPrefix = TRUE;
  456             break;
  457 
  458         default:
  459 
  460             /* Not a prefix character */
  461 
  462             break;
  463         }
  464 
  465         /* Examine first character of name for name segment prefix operator */
  466 
  467         switch (*AmlAddress)
  468         {
  469         case AML_DUAL_NAME_PREFIX:
  470 
  471             ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "DualNamePrefix at %p\n",
  472                 AmlAddress));
  473 
  474             AmlAddress++;
  475             NameString = AcpiExAllocateNameString (PrefixCount, 2);
  476             if (!NameString)
  477             {
  478                 Status = AE_NO_MEMORY;
  479                 break;
  480             }
  481 
  482             /* Indicate that we processed a prefix */
  483 
  484             HasPrefix = TRUE;
  485 
  486             Status = AcpiExNameSegment (&AmlAddress, NameString);
  487             if (ACPI_SUCCESS (Status))
  488             {
  489                 Status = AcpiExNameSegment (&AmlAddress, NameString);
  490             }
  491             break;
  492 
  493         case AML_MULTI_NAME_PREFIX:
  494 
  495             ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "MultiNamePrefix at %p\n",
  496                 AmlAddress));
  497 
  498             /* Fetch count of segments remaining in name path */
  499 
  500             AmlAddress++;
  501             NumSegments = *AmlAddress;
  502 
  503             NameString = AcpiExAllocateNameString (
  504                 PrefixCount, NumSegments);
  505             if (!NameString)
  506             {
  507                 Status = AE_NO_MEMORY;
  508                 break;
  509             }
  510 
  511             /* Indicate that we processed a prefix */
  512 
  513             AmlAddress++;
  514             HasPrefix = TRUE;
  515 
  516             while (NumSegments &&
  517                     (Status = AcpiExNameSegment (&AmlAddress, NameString)) ==
  518                         AE_OK)
  519             {
  520                 NumSegments--;
  521             }
  522 
  523             break;
  524 
  525         case 0:
  526 
  527             /* NullName valid as of 8-12-98 ASL/AML Grammar Update */
  528 
  529             if (PrefixCount == ACPI_UINT32_MAX)
  530             {
  531                 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
  532                     "NameSeg is \"\\\" followed by NULL\n"));
  533             }
  534 
  535             /* Consume the NULL byte */
  536 
  537             AmlAddress++;
  538             NameString = AcpiExAllocateNameString (PrefixCount, 0);
  539             if (!NameString)
  540             {
  541                 Status = AE_NO_MEMORY;
  542                 break;
  543             }
  544 
  545             break;
  546 
  547         default:
  548 
  549             /* Name segment string */
  550 
  551             NameString = AcpiExAllocateNameString (PrefixCount, 1);
  552             if (!NameString)
  553             {
  554                 Status = AE_NO_MEMORY;
  555                 break;
  556             }
  557 
  558             Status = AcpiExNameSegment (&AmlAddress, NameString);
  559             break;
  560         }
  561     }
  562 
  563     if (AE_CTRL_PENDING == Status && HasPrefix)
  564     {
  565         /* Ran out of segments after processing a prefix */
  566 
  567         ACPI_ERROR ((AE_INFO,
  568             "Malformed Name at %p", NameString));
  569         Status = AE_AML_BAD_NAME;
  570     }
  571 
  572     if (ACPI_FAILURE (Status))
  573     {
  574         if (NameString)
  575         {
  576             ACPI_FREE (NameString);
  577         }
  578         return_ACPI_STATUS (Status);
  579     }
  580 
  581     *OutNameString = NameString;
  582     *OutNameLength = (UINT32) (AmlAddress - InAmlAddress);
  583 
  584     return_ACPI_STATUS (Status);
  585 }

Cache object: 2dcdf9fb85fd4aa21628a3815997ae2d


[ 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.