Home | History | Annotate | Line # | Download | only in executer
exnames.c revision 1.1.1.2.4.2
      1  1.1.1.2.4.2  rmind 
      2  1.1.1.2.4.2  rmind /******************************************************************************
      3  1.1.1.2.4.2  rmind  *
      4  1.1.1.2.4.2  rmind  * Module Name: exnames - interpreter/scanner name load/execute
      5  1.1.1.2.4.2  rmind  *
      6  1.1.1.2.4.2  rmind  *****************************************************************************/
      7  1.1.1.2.4.2  rmind 
      8  1.1.1.2.4.2  rmind /*
      9  1.1.1.2.4.2  rmind  * Copyright (C) 2000 - 2011, Intel Corp.
     10  1.1.1.2.4.2  rmind  * All rights reserved.
     11  1.1.1.2.4.2  rmind  *
     12  1.1.1.2.4.2  rmind  * Redistribution and use in source and binary forms, with or without
     13  1.1.1.2.4.2  rmind  * modification, are permitted provided that the following conditions
     14  1.1.1.2.4.2  rmind  * are met:
     15  1.1.1.2.4.2  rmind  * 1. Redistributions of source code must retain the above copyright
     16  1.1.1.2.4.2  rmind  *    notice, this list of conditions, and the following disclaimer,
     17  1.1.1.2.4.2  rmind  *    without modification.
     18  1.1.1.2.4.2  rmind  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     19  1.1.1.2.4.2  rmind  *    substantially similar to the "NO WARRANTY" disclaimer below
     20  1.1.1.2.4.2  rmind  *    ("Disclaimer") and any redistribution must be conditioned upon
     21  1.1.1.2.4.2  rmind  *    including a substantially similar Disclaimer requirement for further
     22  1.1.1.2.4.2  rmind  *    binary redistribution.
     23  1.1.1.2.4.2  rmind  * 3. Neither the names of the above-listed copyright holders nor the names
     24  1.1.1.2.4.2  rmind  *    of any contributors may be used to endorse or promote products derived
     25  1.1.1.2.4.2  rmind  *    from this software without specific prior written permission.
     26  1.1.1.2.4.2  rmind  *
     27  1.1.1.2.4.2  rmind  * Alternatively, this software may be distributed under the terms of the
     28  1.1.1.2.4.2  rmind  * GNU General Public License ("GPL") version 2 as published by the Free
     29  1.1.1.2.4.2  rmind  * Software Foundation.
     30  1.1.1.2.4.2  rmind  *
     31  1.1.1.2.4.2  rmind  * NO WARRANTY
     32  1.1.1.2.4.2  rmind  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     33  1.1.1.2.4.2  rmind  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     34  1.1.1.2.4.2  rmind  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     35  1.1.1.2.4.2  rmind  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     36  1.1.1.2.4.2  rmind  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     37  1.1.1.2.4.2  rmind  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     38  1.1.1.2.4.2  rmind  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     39  1.1.1.2.4.2  rmind  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     40  1.1.1.2.4.2  rmind  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     41  1.1.1.2.4.2  rmind  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     42  1.1.1.2.4.2  rmind  * POSSIBILITY OF SUCH DAMAGES.
     43  1.1.1.2.4.2  rmind  */
     44  1.1.1.2.4.2  rmind 
     45  1.1.1.2.4.2  rmind #define __EXNAMES_C__
     46  1.1.1.2.4.2  rmind 
     47  1.1.1.2.4.2  rmind #include "acpi.h"
     48  1.1.1.2.4.2  rmind #include "accommon.h"
     49  1.1.1.2.4.2  rmind #include "acinterp.h"
     50  1.1.1.2.4.2  rmind #include "amlcode.h"
     51  1.1.1.2.4.2  rmind 
     52  1.1.1.2.4.2  rmind #define _COMPONENT          ACPI_EXECUTER
     53  1.1.1.2.4.2  rmind         ACPI_MODULE_NAME    ("exnames")
     54  1.1.1.2.4.2  rmind 
     55  1.1.1.2.4.2  rmind /* Local prototypes */
     56  1.1.1.2.4.2  rmind 
     57  1.1.1.2.4.2  rmind static char *
     58  1.1.1.2.4.2  rmind AcpiExAllocateNameString (
     59  1.1.1.2.4.2  rmind     UINT32                  PrefixCount,
     60  1.1.1.2.4.2  rmind     UINT32                  NumNameSegs);
     61  1.1.1.2.4.2  rmind 
     62  1.1.1.2.4.2  rmind static ACPI_STATUS
     63  1.1.1.2.4.2  rmind AcpiExNameSegment (
     64  1.1.1.2.4.2  rmind     UINT8                   **InAmlAddress,
     65  1.1.1.2.4.2  rmind     char                    *NameString);
     66  1.1.1.2.4.2  rmind 
     67  1.1.1.2.4.2  rmind 
     68  1.1.1.2.4.2  rmind /*******************************************************************************
     69  1.1.1.2.4.2  rmind  *
     70  1.1.1.2.4.2  rmind  * FUNCTION:    AcpiExAllocateNameString
     71  1.1.1.2.4.2  rmind  *
     72  1.1.1.2.4.2  rmind  * PARAMETERS:  PrefixCount         - Count of parent levels. Special cases:
     73  1.1.1.2.4.2  rmind  *                                    (-1)==root,  0==none
     74  1.1.1.2.4.2  rmind  *              NumNameSegs         - count of 4-character name segments
     75  1.1.1.2.4.2  rmind  *
     76  1.1.1.2.4.2  rmind  * RETURN:      A pointer to the allocated string segment.  This segment must
     77  1.1.1.2.4.2  rmind  *              be deleted by the caller.
     78  1.1.1.2.4.2  rmind  *
     79  1.1.1.2.4.2  rmind  * DESCRIPTION: Allocate a buffer for a name string. Ensure allocated name
     80  1.1.1.2.4.2  rmind  *              string is long enough, and set up prefix if any.
     81  1.1.1.2.4.2  rmind  *
     82  1.1.1.2.4.2  rmind  ******************************************************************************/
     83  1.1.1.2.4.2  rmind 
     84  1.1.1.2.4.2  rmind static char *
     85  1.1.1.2.4.2  rmind AcpiExAllocateNameString (
     86  1.1.1.2.4.2  rmind     UINT32                  PrefixCount,
     87  1.1.1.2.4.2  rmind     UINT32                  NumNameSegs)
     88  1.1.1.2.4.2  rmind {
     89  1.1.1.2.4.2  rmind     char                    *TempPtr;
     90  1.1.1.2.4.2  rmind     char                    *NameString;
     91  1.1.1.2.4.2  rmind     UINT32                   SizeNeeded;
     92  1.1.1.2.4.2  rmind 
     93  1.1.1.2.4.2  rmind     ACPI_FUNCTION_TRACE (ExAllocateNameString);
     94  1.1.1.2.4.2  rmind 
     95  1.1.1.2.4.2  rmind 
     96  1.1.1.2.4.2  rmind     /*
     97  1.1.1.2.4.2  rmind      * Allow room for all \ and ^ prefixes, all segments and a MultiNamePrefix.
     98  1.1.1.2.4.2  rmind      * Also, one byte for the null terminator.
     99  1.1.1.2.4.2  rmind      * This may actually be somewhat longer than needed.
    100  1.1.1.2.4.2  rmind      */
    101  1.1.1.2.4.2  rmind     if (PrefixCount == ACPI_UINT32_MAX)
    102  1.1.1.2.4.2  rmind     {
    103  1.1.1.2.4.2  rmind         /* Special case for root */
    104  1.1.1.2.4.2  rmind 
    105  1.1.1.2.4.2  rmind         SizeNeeded = 1 + (ACPI_NAME_SIZE * NumNameSegs) + 2 + 1;
    106  1.1.1.2.4.2  rmind     }
    107  1.1.1.2.4.2  rmind     else
    108  1.1.1.2.4.2  rmind     {
    109  1.1.1.2.4.2  rmind         SizeNeeded = PrefixCount + (ACPI_NAME_SIZE * NumNameSegs) + 2 + 1;
    110  1.1.1.2.4.2  rmind     }
    111  1.1.1.2.4.2  rmind 
    112  1.1.1.2.4.2  rmind     /*
    113  1.1.1.2.4.2  rmind      * Allocate a buffer for the name.
    114  1.1.1.2.4.2  rmind      * This buffer must be deleted by the caller!
    115  1.1.1.2.4.2  rmind      */
    116  1.1.1.2.4.2  rmind     NameString = ACPI_ALLOCATE (SizeNeeded);
    117  1.1.1.2.4.2  rmind     if (!NameString)
    118  1.1.1.2.4.2  rmind     {
    119  1.1.1.2.4.2  rmind         ACPI_ERROR ((AE_INFO,
    120  1.1.1.2.4.2  rmind             "Could not allocate size %u", SizeNeeded));
    121  1.1.1.2.4.2  rmind         return_PTR (NULL);
    122  1.1.1.2.4.2  rmind     }
    123  1.1.1.2.4.2  rmind 
    124  1.1.1.2.4.2  rmind     TempPtr = NameString;
    125  1.1.1.2.4.2  rmind 
    126  1.1.1.2.4.2  rmind     /* Set up Root or Parent prefixes if needed */
    127  1.1.1.2.4.2  rmind 
    128  1.1.1.2.4.2  rmind     if (PrefixCount == ACPI_UINT32_MAX)
    129  1.1.1.2.4.2  rmind     {
    130  1.1.1.2.4.2  rmind         *TempPtr++ = AML_ROOT_PREFIX;
    131  1.1.1.2.4.2  rmind     }
    132  1.1.1.2.4.2  rmind     else
    133  1.1.1.2.4.2  rmind     {
    134  1.1.1.2.4.2  rmind         while (PrefixCount--)
    135  1.1.1.2.4.2  rmind         {
    136  1.1.1.2.4.2  rmind             *TempPtr++ = AML_PARENT_PREFIX;
    137  1.1.1.2.4.2  rmind         }
    138  1.1.1.2.4.2  rmind     }
    139  1.1.1.2.4.2  rmind 
    140  1.1.1.2.4.2  rmind 
    141  1.1.1.2.4.2  rmind     /* Set up Dual or Multi prefixes if needed */
    142  1.1.1.2.4.2  rmind 
    143  1.1.1.2.4.2  rmind     if (NumNameSegs > 2)
    144  1.1.1.2.4.2  rmind     {
    145  1.1.1.2.4.2  rmind         /* Set up multi prefixes   */
    146  1.1.1.2.4.2  rmind 
    147  1.1.1.2.4.2  rmind         *TempPtr++ = AML_MULTI_NAME_PREFIX_OP;
    148  1.1.1.2.4.2  rmind         *TempPtr++ = (char) NumNameSegs;
    149  1.1.1.2.4.2  rmind     }
    150  1.1.1.2.4.2  rmind     else if (2 == NumNameSegs)
    151  1.1.1.2.4.2  rmind     {
    152  1.1.1.2.4.2  rmind         /* Set up dual prefixes */
    153  1.1.1.2.4.2  rmind 
    154  1.1.1.2.4.2  rmind         *TempPtr++ = AML_DUAL_NAME_PREFIX;
    155  1.1.1.2.4.2  rmind     }
    156  1.1.1.2.4.2  rmind 
    157  1.1.1.2.4.2  rmind     /*
    158  1.1.1.2.4.2  rmind      * Terminate string following prefixes. AcpiExNameSegment() will
    159  1.1.1.2.4.2  rmind      * append the segment(s)
    160  1.1.1.2.4.2  rmind      */
    161  1.1.1.2.4.2  rmind     *TempPtr = 0;
    162  1.1.1.2.4.2  rmind 
    163  1.1.1.2.4.2  rmind     return_PTR (NameString);
    164  1.1.1.2.4.2  rmind }
    165  1.1.1.2.4.2  rmind 
    166  1.1.1.2.4.2  rmind /*******************************************************************************
    167  1.1.1.2.4.2  rmind  *
    168  1.1.1.2.4.2  rmind  * FUNCTION:    AcpiExNameSegment
    169  1.1.1.2.4.2  rmind  *
    170  1.1.1.2.4.2  rmind  * PARAMETERS:  InAmlAddress    - Pointer to the name in the AML code
    171  1.1.1.2.4.2  rmind  *              NameString      - Where to return the name. The name is appended
    172  1.1.1.2.4.2  rmind  *                                to any existing string to form a namepath
    173  1.1.1.2.4.2  rmind  *
    174  1.1.1.2.4.2  rmind  * RETURN:      Status
    175  1.1.1.2.4.2  rmind  *
    176  1.1.1.2.4.2  rmind  * DESCRIPTION: Extract an ACPI name (4 bytes) from the AML byte stream
    177  1.1.1.2.4.2  rmind  *
    178  1.1.1.2.4.2  rmind  ******************************************************************************/
    179  1.1.1.2.4.2  rmind 
    180  1.1.1.2.4.2  rmind static ACPI_STATUS
    181  1.1.1.2.4.2  rmind AcpiExNameSegment (
    182  1.1.1.2.4.2  rmind     UINT8                   **InAmlAddress,
    183  1.1.1.2.4.2  rmind     char                    *NameString)
    184  1.1.1.2.4.2  rmind {
    185  1.1.1.2.4.2  rmind     char                    *AmlAddress = (void *) *InAmlAddress;
    186  1.1.1.2.4.2  rmind     ACPI_STATUS             Status = AE_OK;
    187  1.1.1.2.4.2  rmind     UINT32                  Index;
    188  1.1.1.2.4.2  rmind     char                    CharBuf[5];
    189  1.1.1.2.4.2  rmind 
    190  1.1.1.2.4.2  rmind 
    191  1.1.1.2.4.2  rmind     ACPI_FUNCTION_TRACE (ExNameSegment);
    192  1.1.1.2.4.2  rmind 
    193  1.1.1.2.4.2  rmind 
    194  1.1.1.2.4.2  rmind     /*
    195  1.1.1.2.4.2  rmind      * If first character is a digit, then we know that we aren't looking at a
    196  1.1.1.2.4.2  rmind      * valid name segment
    197  1.1.1.2.4.2  rmind      */
    198  1.1.1.2.4.2  rmind     CharBuf[0] = *AmlAddress;
    199  1.1.1.2.4.2  rmind 
    200  1.1.1.2.4.2  rmind     if ('0' <= CharBuf[0] && CharBuf[0] <= '9')
    201  1.1.1.2.4.2  rmind     {
    202  1.1.1.2.4.2  rmind         ACPI_ERROR ((AE_INFO, "Invalid leading digit: %c", CharBuf[0]));
    203  1.1.1.2.4.2  rmind         return_ACPI_STATUS (AE_CTRL_PENDING);
    204  1.1.1.2.4.2  rmind     }
    205  1.1.1.2.4.2  rmind 
    206  1.1.1.2.4.2  rmind     ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "Bytes from stream:\n"));
    207  1.1.1.2.4.2  rmind 
    208  1.1.1.2.4.2  rmind     for (Index = 0;
    209  1.1.1.2.4.2  rmind         (Index < ACPI_NAME_SIZE) && (AcpiUtValidAcpiChar (*AmlAddress, 0));
    210  1.1.1.2.4.2  rmind         Index++)
    211  1.1.1.2.4.2  rmind     {
    212  1.1.1.2.4.2  rmind         CharBuf[Index] = *AmlAddress++;
    213  1.1.1.2.4.2  rmind         ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "%c\n", CharBuf[Index]));
    214  1.1.1.2.4.2  rmind     }
    215  1.1.1.2.4.2  rmind 
    216  1.1.1.2.4.2  rmind 
    217  1.1.1.2.4.2  rmind     /* Valid name segment  */
    218  1.1.1.2.4.2  rmind 
    219  1.1.1.2.4.2  rmind     if (Index == 4)
    220  1.1.1.2.4.2  rmind     {
    221  1.1.1.2.4.2  rmind         /* Found 4 valid characters */
    222  1.1.1.2.4.2  rmind 
    223  1.1.1.2.4.2  rmind         CharBuf[4] = '\0';
    224  1.1.1.2.4.2  rmind 
    225  1.1.1.2.4.2  rmind         if (NameString)
    226  1.1.1.2.4.2  rmind         {
    227  1.1.1.2.4.2  rmind             ACPI_STRCAT (NameString, CharBuf);
    228  1.1.1.2.4.2  rmind             ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
    229  1.1.1.2.4.2  rmind                 "Appended to - %s\n", NameString));
    230  1.1.1.2.4.2  rmind         }
    231  1.1.1.2.4.2  rmind         else
    232  1.1.1.2.4.2  rmind         {
    233  1.1.1.2.4.2  rmind             ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
    234  1.1.1.2.4.2  rmind                 "No Name string - %s\n", CharBuf));
    235  1.1.1.2.4.2  rmind         }
    236  1.1.1.2.4.2  rmind     }
    237  1.1.1.2.4.2  rmind     else if (Index == 0)
    238  1.1.1.2.4.2  rmind     {
    239  1.1.1.2.4.2  rmind         /*
    240  1.1.1.2.4.2  rmind          * First character was not a valid name character,
    241  1.1.1.2.4.2  rmind          * so we are looking at something other than a name.
    242  1.1.1.2.4.2  rmind          */
    243  1.1.1.2.4.2  rmind         ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
    244  1.1.1.2.4.2  rmind             "Leading character is not alpha: %02Xh (not a name)\n",
    245  1.1.1.2.4.2  rmind             CharBuf[0]));
    246  1.1.1.2.4.2  rmind         Status = AE_CTRL_PENDING;
    247  1.1.1.2.4.2  rmind     }
    248  1.1.1.2.4.2  rmind     else
    249  1.1.1.2.4.2  rmind     {
    250  1.1.1.2.4.2  rmind         /*
    251  1.1.1.2.4.2  rmind          * Segment started with one or more valid characters, but fewer than
    252  1.1.1.2.4.2  rmind          * the required 4
    253  1.1.1.2.4.2  rmind          */
    254  1.1.1.2.4.2  rmind         Status = AE_AML_BAD_NAME;
    255  1.1.1.2.4.2  rmind         ACPI_ERROR ((AE_INFO,
    256  1.1.1.2.4.2  rmind             "Bad character 0x%02x in name, at %p",
    257  1.1.1.2.4.2  rmind             *AmlAddress, AmlAddress));
    258  1.1.1.2.4.2  rmind     }
    259  1.1.1.2.4.2  rmind 
    260  1.1.1.2.4.2  rmind     *InAmlAddress = ACPI_CAST_PTR (UINT8, AmlAddress);
    261  1.1.1.2.4.2  rmind     return_ACPI_STATUS (Status);
    262  1.1.1.2.4.2  rmind }
    263  1.1.1.2.4.2  rmind 
    264  1.1.1.2.4.2  rmind 
    265  1.1.1.2.4.2  rmind /*******************************************************************************
    266  1.1.1.2.4.2  rmind  *
    267  1.1.1.2.4.2  rmind  * FUNCTION:    AcpiExGetNameString
    268  1.1.1.2.4.2  rmind  *
    269  1.1.1.2.4.2  rmind  * PARAMETERS:  DataType            - Object type to be associated with this
    270  1.1.1.2.4.2  rmind  *                                    name
    271  1.1.1.2.4.2  rmind  *              InAmlAddress        - Pointer to the namestring in the AML code
    272  1.1.1.2.4.2  rmind  *              OutNameString       - Where the namestring is returned
    273  1.1.1.2.4.2  rmind  *              OutNameLength       - Length of the returned string
    274  1.1.1.2.4.2  rmind  *
    275  1.1.1.2.4.2  rmind  * RETURN:      Status, namestring and length
    276  1.1.1.2.4.2  rmind  *
    277  1.1.1.2.4.2  rmind  * DESCRIPTION: Extract a full namepath from the AML byte stream,
    278  1.1.1.2.4.2  rmind  *              including any prefixes.
    279  1.1.1.2.4.2  rmind  *
    280  1.1.1.2.4.2  rmind  ******************************************************************************/
    281  1.1.1.2.4.2  rmind 
    282  1.1.1.2.4.2  rmind ACPI_STATUS
    283  1.1.1.2.4.2  rmind AcpiExGetNameString (
    284  1.1.1.2.4.2  rmind     ACPI_OBJECT_TYPE        DataType,
    285  1.1.1.2.4.2  rmind     UINT8                   *InAmlAddress,
    286  1.1.1.2.4.2  rmind     char                    **OutNameString,
    287  1.1.1.2.4.2  rmind     UINT32                  *OutNameLength)
    288  1.1.1.2.4.2  rmind {
    289  1.1.1.2.4.2  rmind     ACPI_STATUS             Status = AE_OK;
    290  1.1.1.2.4.2  rmind     UINT8                   *AmlAddress = InAmlAddress;
    291  1.1.1.2.4.2  rmind     char                    *NameString = NULL;
    292  1.1.1.2.4.2  rmind     UINT32                  NumSegments;
    293  1.1.1.2.4.2  rmind     UINT32                  PrefixCount = 0;
    294  1.1.1.2.4.2  rmind     BOOLEAN                 HasPrefix = FALSE;
    295  1.1.1.2.4.2  rmind 
    296  1.1.1.2.4.2  rmind 
    297  1.1.1.2.4.2  rmind     ACPI_FUNCTION_TRACE_PTR (ExGetNameString, AmlAddress);
    298  1.1.1.2.4.2  rmind 
    299  1.1.1.2.4.2  rmind 
    300  1.1.1.2.4.2  rmind     if (ACPI_TYPE_LOCAL_REGION_FIELD == DataType   ||
    301  1.1.1.2.4.2  rmind         ACPI_TYPE_LOCAL_BANK_FIELD == DataType     ||
    302  1.1.1.2.4.2  rmind         ACPI_TYPE_LOCAL_INDEX_FIELD == DataType)
    303  1.1.1.2.4.2  rmind     {
    304  1.1.1.2.4.2  rmind         /* Disallow prefixes for types associated with FieldUnit names */
    305  1.1.1.2.4.2  rmind 
    306  1.1.1.2.4.2  rmind         NameString = AcpiExAllocateNameString (0, 1);
    307  1.1.1.2.4.2  rmind         if (!NameString)
    308  1.1.1.2.4.2  rmind         {
    309  1.1.1.2.4.2  rmind             Status = AE_NO_MEMORY;
    310  1.1.1.2.4.2  rmind         }
    311  1.1.1.2.4.2  rmind         else
    312  1.1.1.2.4.2  rmind         {
    313  1.1.1.2.4.2  rmind             Status = AcpiExNameSegment (&AmlAddress, NameString);
    314  1.1.1.2.4.2  rmind         }
    315  1.1.1.2.4.2  rmind     }
    316  1.1.1.2.4.2  rmind     else
    317  1.1.1.2.4.2  rmind     {
    318  1.1.1.2.4.2  rmind         /*
    319  1.1.1.2.4.2  rmind          * DataType is not a field name.
    320  1.1.1.2.4.2  rmind          * Examine first character of name for root or parent prefix operators
    321  1.1.1.2.4.2  rmind          */
    322  1.1.1.2.4.2  rmind         switch (*AmlAddress)
    323  1.1.1.2.4.2  rmind         {
    324  1.1.1.2.4.2  rmind         case AML_ROOT_PREFIX:
    325  1.1.1.2.4.2  rmind 
    326  1.1.1.2.4.2  rmind             ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "RootPrefix(\\) at %p\n",
    327  1.1.1.2.4.2  rmind                 AmlAddress));
    328  1.1.1.2.4.2  rmind 
    329  1.1.1.2.4.2  rmind             /*
    330  1.1.1.2.4.2  rmind              * Remember that we have a RootPrefix --
    331  1.1.1.2.4.2  rmind              * see comment in AcpiExAllocateNameString()
    332  1.1.1.2.4.2  rmind              */
    333  1.1.1.2.4.2  rmind             AmlAddress++;
    334  1.1.1.2.4.2  rmind             PrefixCount = ACPI_UINT32_MAX;
    335  1.1.1.2.4.2  rmind             HasPrefix = TRUE;
    336  1.1.1.2.4.2  rmind             break;
    337  1.1.1.2.4.2  rmind 
    338  1.1.1.2.4.2  rmind 
    339  1.1.1.2.4.2  rmind         case AML_PARENT_PREFIX:
    340  1.1.1.2.4.2  rmind 
    341  1.1.1.2.4.2  rmind             /* Increment past possibly multiple parent prefixes */
    342  1.1.1.2.4.2  rmind 
    343  1.1.1.2.4.2  rmind             do
    344  1.1.1.2.4.2  rmind             {
    345  1.1.1.2.4.2  rmind                 ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "ParentPrefix (^) at %p\n",
    346  1.1.1.2.4.2  rmind                     AmlAddress));
    347  1.1.1.2.4.2  rmind 
    348  1.1.1.2.4.2  rmind                 AmlAddress++;
    349  1.1.1.2.4.2  rmind                 PrefixCount++;
    350  1.1.1.2.4.2  rmind 
    351  1.1.1.2.4.2  rmind             } while (*AmlAddress == AML_PARENT_PREFIX);
    352  1.1.1.2.4.2  rmind 
    353  1.1.1.2.4.2  rmind             HasPrefix = TRUE;
    354  1.1.1.2.4.2  rmind             break;
    355  1.1.1.2.4.2  rmind 
    356  1.1.1.2.4.2  rmind 
    357  1.1.1.2.4.2  rmind         default:
    358  1.1.1.2.4.2  rmind 
    359  1.1.1.2.4.2  rmind             /* Not a prefix character */
    360  1.1.1.2.4.2  rmind 
    361  1.1.1.2.4.2  rmind             break;
    362  1.1.1.2.4.2  rmind         }
    363  1.1.1.2.4.2  rmind 
    364  1.1.1.2.4.2  rmind         /* Examine first character of name for name segment prefix operator */
    365  1.1.1.2.4.2  rmind 
    366  1.1.1.2.4.2  rmind         switch (*AmlAddress)
    367  1.1.1.2.4.2  rmind         {
    368  1.1.1.2.4.2  rmind         case AML_DUAL_NAME_PREFIX:
    369  1.1.1.2.4.2  rmind 
    370  1.1.1.2.4.2  rmind             ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "DualNamePrefix at %p\n",
    371  1.1.1.2.4.2  rmind                 AmlAddress));
    372  1.1.1.2.4.2  rmind 
    373  1.1.1.2.4.2  rmind             AmlAddress++;
    374  1.1.1.2.4.2  rmind             NameString = AcpiExAllocateNameString (PrefixCount, 2);
    375  1.1.1.2.4.2  rmind             if (!NameString)
    376  1.1.1.2.4.2  rmind             {
    377  1.1.1.2.4.2  rmind                 Status = AE_NO_MEMORY;
    378  1.1.1.2.4.2  rmind                 break;
    379  1.1.1.2.4.2  rmind             }
    380  1.1.1.2.4.2  rmind 
    381  1.1.1.2.4.2  rmind             /* Indicate that we processed a prefix */
    382  1.1.1.2.4.2  rmind 
    383  1.1.1.2.4.2  rmind             HasPrefix = TRUE;
    384  1.1.1.2.4.2  rmind 
    385  1.1.1.2.4.2  rmind             Status = AcpiExNameSegment (&AmlAddress, NameString);
    386  1.1.1.2.4.2  rmind             if (ACPI_SUCCESS (Status))
    387  1.1.1.2.4.2  rmind             {
    388  1.1.1.2.4.2  rmind                 Status = AcpiExNameSegment (&AmlAddress, NameString);
    389  1.1.1.2.4.2  rmind             }
    390  1.1.1.2.4.2  rmind             break;
    391  1.1.1.2.4.2  rmind 
    392  1.1.1.2.4.2  rmind 
    393  1.1.1.2.4.2  rmind         case AML_MULTI_NAME_PREFIX_OP:
    394  1.1.1.2.4.2  rmind 
    395  1.1.1.2.4.2  rmind             ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "MultiNamePrefix at %p\n",
    396  1.1.1.2.4.2  rmind                 AmlAddress));
    397  1.1.1.2.4.2  rmind 
    398  1.1.1.2.4.2  rmind             /* Fetch count of segments remaining in name path */
    399  1.1.1.2.4.2  rmind 
    400  1.1.1.2.4.2  rmind             AmlAddress++;
    401  1.1.1.2.4.2  rmind             NumSegments = *AmlAddress;
    402  1.1.1.2.4.2  rmind 
    403  1.1.1.2.4.2  rmind             NameString = AcpiExAllocateNameString (PrefixCount, NumSegments);
    404  1.1.1.2.4.2  rmind             if (!NameString)
    405  1.1.1.2.4.2  rmind             {
    406  1.1.1.2.4.2  rmind                 Status = AE_NO_MEMORY;
    407  1.1.1.2.4.2  rmind                 break;
    408  1.1.1.2.4.2  rmind             }
    409  1.1.1.2.4.2  rmind 
    410  1.1.1.2.4.2  rmind             /* Indicate that we processed a prefix */
    411  1.1.1.2.4.2  rmind 
    412  1.1.1.2.4.2  rmind             AmlAddress++;
    413  1.1.1.2.4.2  rmind             HasPrefix = TRUE;
    414  1.1.1.2.4.2  rmind 
    415  1.1.1.2.4.2  rmind             while (NumSegments &&
    416  1.1.1.2.4.2  rmind                     (Status = AcpiExNameSegment (&AmlAddress, NameString)) ==
    417  1.1.1.2.4.2  rmind                         AE_OK)
    418  1.1.1.2.4.2  rmind             {
    419  1.1.1.2.4.2  rmind                 NumSegments--;
    420  1.1.1.2.4.2  rmind             }
    421  1.1.1.2.4.2  rmind 
    422  1.1.1.2.4.2  rmind             break;
    423  1.1.1.2.4.2  rmind 
    424  1.1.1.2.4.2  rmind 
    425  1.1.1.2.4.2  rmind         case 0:
    426  1.1.1.2.4.2  rmind 
    427  1.1.1.2.4.2  rmind             /* NullName valid as of 8-12-98 ASL/AML Grammar Update */
    428  1.1.1.2.4.2  rmind 
    429  1.1.1.2.4.2  rmind             if (PrefixCount == ACPI_UINT32_MAX)
    430  1.1.1.2.4.2  rmind             {
    431  1.1.1.2.4.2  rmind                 ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
    432  1.1.1.2.4.2  rmind                     "NameSeg is \"\\\" followed by NULL\n"));
    433  1.1.1.2.4.2  rmind             }
    434  1.1.1.2.4.2  rmind 
    435  1.1.1.2.4.2  rmind             /* Consume the NULL byte */
    436  1.1.1.2.4.2  rmind 
    437  1.1.1.2.4.2  rmind             AmlAddress++;
    438  1.1.1.2.4.2  rmind             NameString = AcpiExAllocateNameString (PrefixCount, 0);
    439  1.1.1.2.4.2  rmind             if (!NameString)
    440  1.1.1.2.4.2  rmind             {
    441  1.1.1.2.4.2  rmind                 Status = AE_NO_MEMORY;
    442  1.1.1.2.4.2  rmind                 break;
    443  1.1.1.2.4.2  rmind             }
    444  1.1.1.2.4.2  rmind 
    445  1.1.1.2.4.2  rmind             break;
    446  1.1.1.2.4.2  rmind 
    447  1.1.1.2.4.2  rmind 
    448  1.1.1.2.4.2  rmind         default:
    449  1.1.1.2.4.2  rmind 
    450  1.1.1.2.4.2  rmind             /* Name segment string */
    451  1.1.1.2.4.2  rmind 
    452  1.1.1.2.4.2  rmind             NameString = AcpiExAllocateNameString (PrefixCount, 1);
    453  1.1.1.2.4.2  rmind             if (!NameString)
    454  1.1.1.2.4.2  rmind             {
    455  1.1.1.2.4.2  rmind                 Status = AE_NO_MEMORY;
    456  1.1.1.2.4.2  rmind                 break;
    457  1.1.1.2.4.2  rmind             }
    458  1.1.1.2.4.2  rmind 
    459  1.1.1.2.4.2  rmind             Status = AcpiExNameSegment (&AmlAddress, NameString);
    460  1.1.1.2.4.2  rmind             break;
    461  1.1.1.2.4.2  rmind         }
    462  1.1.1.2.4.2  rmind     }
    463  1.1.1.2.4.2  rmind 
    464  1.1.1.2.4.2  rmind     if (AE_CTRL_PENDING == Status && HasPrefix)
    465  1.1.1.2.4.2  rmind     {
    466  1.1.1.2.4.2  rmind         /* Ran out of segments after processing a prefix */
    467  1.1.1.2.4.2  rmind 
    468  1.1.1.2.4.2  rmind         ACPI_ERROR ((AE_INFO,
    469  1.1.1.2.4.2  rmind             "Malformed Name at %p", NameString));
    470  1.1.1.2.4.2  rmind         Status = AE_AML_BAD_NAME;
    471  1.1.1.2.4.2  rmind     }
    472  1.1.1.2.4.2  rmind 
    473  1.1.1.2.4.2  rmind     if (ACPI_FAILURE (Status))
    474  1.1.1.2.4.2  rmind     {
    475  1.1.1.2.4.2  rmind         if (NameString)
    476  1.1.1.2.4.2  rmind         {
    477  1.1.1.2.4.2  rmind             ACPI_FREE (NameString);
    478  1.1.1.2.4.2  rmind         }
    479  1.1.1.2.4.2  rmind         return_ACPI_STATUS (Status);
    480  1.1.1.2.4.2  rmind     }
    481  1.1.1.2.4.2  rmind 
    482  1.1.1.2.4.2  rmind     *OutNameString = NameString;
    483  1.1.1.2.4.2  rmind     *OutNameLength = (UINT32) (AmlAddress - InAmlAddress);
    484  1.1.1.2.4.2  rmind 
    485  1.1.1.2.4.2  rmind     return_ACPI_STATUS (Status);
    486  1.1.1.2.4.2  rmind }
    487  1.1.1.2.4.2  rmind 
    488  1.1.1.2.4.2  rmind 
    489