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