10b94ba42SJung-uk Kim /****************************************************************************** 20b94ba42SJung-uk Kim * 30b94ba42SJung-uk Kim * Module Name: dtexpress.c - Support for integer expressions and labels 40b94ba42SJung-uk Kim * 50b94ba42SJung-uk Kim *****************************************************************************/ 60b94ba42SJung-uk Kim 70b94ba42SJung-uk Kim /* 8ec3fc72fSJung-uk Kim * Copyright (C) 2000 - 2012, Intel Corp. 90b94ba42SJung-uk Kim * All rights reserved. 100b94ba42SJung-uk Kim * 110b94ba42SJung-uk Kim * Redistribution and use in source and binary forms, with or without 120b94ba42SJung-uk Kim * modification, are permitted provided that the following conditions 130b94ba42SJung-uk Kim * are met: 140b94ba42SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 150b94ba42SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 160b94ba42SJung-uk Kim * without modification. 170b94ba42SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 180b94ba42SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 190b94ba42SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 200b94ba42SJung-uk Kim * including a substantially similar Disclaimer requirement for further 210b94ba42SJung-uk Kim * binary redistribution. 220b94ba42SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 230b94ba42SJung-uk Kim * of any contributors may be used to endorse or promote products derived 240b94ba42SJung-uk Kim * from this software without specific prior written permission. 250b94ba42SJung-uk Kim * 260b94ba42SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 270b94ba42SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 280b94ba42SJung-uk Kim * Software Foundation. 290b94ba42SJung-uk Kim * 300b94ba42SJung-uk Kim * NO WARRANTY 310b94ba42SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 320b94ba42SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 330b94ba42SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 340b94ba42SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 350b94ba42SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 360b94ba42SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 370b94ba42SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 380b94ba42SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 390b94ba42SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 400b94ba42SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 410b94ba42SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 420b94ba42SJung-uk Kim */ 430b94ba42SJung-uk Kim 440b94ba42SJung-uk Kim #define __DTEXPRESS_C__ 450b94ba42SJung-uk Kim 460b94ba42SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 470b94ba42SJung-uk Kim #include <contrib/dev/acpica/compiler/dtcompiler.h> 48d052a1ccSJung-uk Kim #include "dtparser.y.h" 490b94ba42SJung-uk Kim 500b94ba42SJung-uk Kim #define _COMPONENT DT_COMPILER 510b94ba42SJung-uk Kim ACPI_MODULE_NAME ("dtexpress") 520b94ba42SJung-uk Kim 530b94ba42SJung-uk Kim 540b94ba42SJung-uk Kim /* Local prototypes */ 550b94ba42SJung-uk Kim 560b94ba42SJung-uk Kim static void 570b94ba42SJung-uk Kim DtInsertLabelField ( 580b94ba42SJung-uk Kim DT_FIELD *Field); 590b94ba42SJung-uk Kim 600b94ba42SJung-uk Kim static DT_FIELD * 610b94ba42SJung-uk Kim DtLookupLabel ( 620b94ba42SJung-uk Kim char *Name); 630b94ba42SJung-uk Kim 64d052a1ccSJung-uk Kim /* Global used for errors during parse and related functions */ 65d052a1ccSJung-uk Kim 66d052a1ccSJung-uk Kim DT_FIELD *Gbl_CurrentField; 67d052a1ccSJung-uk Kim 680b94ba42SJung-uk Kim 690b94ba42SJung-uk Kim /****************************************************************************** 700b94ba42SJung-uk Kim * 710b94ba42SJung-uk Kim * FUNCTION: DtResolveIntegerExpression 720b94ba42SJung-uk Kim * 730b94ba42SJung-uk Kim * PARAMETERS: Field - Field object with Integer expression 74d052a1ccSJung-uk Kim * ReturnValue - Where the integer is returned 750b94ba42SJung-uk Kim * 76d052a1ccSJung-uk Kim * RETURN: Status, and the resolved 64-bit integer value 770b94ba42SJung-uk Kim * 780b94ba42SJung-uk Kim * DESCRIPTION: Resolve an integer expression to a single value. Supports 79d052a1ccSJung-uk Kim * both integer constants and labels. 800b94ba42SJung-uk Kim * 810b94ba42SJung-uk Kim *****************************************************************************/ 820b94ba42SJung-uk Kim 83d052a1ccSJung-uk Kim ACPI_STATUS 840b94ba42SJung-uk Kim DtResolveIntegerExpression ( 85d052a1ccSJung-uk Kim DT_FIELD *Field, 86d052a1ccSJung-uk Kim UINT64 *ReturnValue) 870b94ba42SJung-uk Kim { 88d052a1ccSJung-uk Kim UINT64 Result; 890b94ba42SJung-uk Kim 900b94ba42SJung-uk Kim 910b94ba42SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, "Full Integer expression: %s\n", 920b94ba42SJung-uk Kim Field->Value); 930b94ba42SJung-uk Kim 94d052a1ccSJung-uk Kim Gbl_CurrentField = Field; 950b94ba42SJung-uk Kim 96d052a1ccSJung-uk Kim Result = DtEvaluateExpression (Field->Value); 97d052a1ccSJung-uk Kim *ReturnValue = Result; 98d052a1ccSJung-uk Kim return (AE_OK); 990b94ba42SJung-uk Kim } 1000b94ba42SJung-uk Kim 1010b94ba42SJung-uk Kim 102d052a1ccSJung-uk Kim /****************************************************************************** 103d052a1ccSJung-uk Kim * 104d052a1ccSJung-uk Kim * FUNCTION: DtDoOperator 105d052a1ccSJung-uk Kim * 106d052a1ccSJung-uk Kim * PARAMETERS: LeftValue - First 64-bit operand 107d052a1ccSJung-uk Kim * Operator - Parse token for the operator (EXPOP_*) 108d052a1ccSJung-uk Kim * RightValue - Second 64-bit operand 109d052a1ccSJung-uk Kim * 110d052a1ccSJung-uk Kim * RETURN: 64-bit result of the requested operation 111d052a1ccSJung-uk Kim * 112d052a1ccSJung-uk Kim * DESCRIPTION: Perform the various 64-bit integer math functions 113d052a1ccSJung-uk Kim * 114d052a1ccSJung-uk Kim *****************************************************************************/ 115d052a1ccSJung-uk Kim 116d052a1ccSJung-uk Kim UINT64 117d052a1ccSJung-uk Kim DtDoOperator ( 118d052a1ccSJung-uk Kim UINT64 LeftValue, 119d052a1ccSJung-uk Kim UINT32 Operator, 120d052a1ccSJung-uk Kim UINT64 RightValue) 1210b94ba42SJung-uk Kim { 122d052a1ccSJung-uk Kim UINT64 Result; 1230b94ba42SJung-uk Kim 1240b94ba42SJung-uk Kim 1250b94ba42SJung-uk Kim /* Perform the requested operation */ 1260b94ba42SJung-uk Kim 127d052a1ccSJung-uk Kim switch (Operator) 1280b94ba42SJung-uk Kim { 129d052a1ccSJung-uk Kim case EXPOP_ONES_COMPLIMENT: 130d052a1ccSJung-uk Kim Result = ~RightValue; 1310b94ba42SJung-uk Kim break; 1320b94ba42SJung-uk Kim 133d052a1ccSJung-uk Kim case EXPOP_LOGICAL_NOT: 134d052a1ccSJung-uk Kim Result = !RightValue; 1350b94ba42SJung-uk Kim break; 1360b94ba42SJung-uk Kim 137d052a1ccSJung-uk Kim case EXPOP_MULTIPLY: 138d052a1ccSJung-uk Kim Result = LeftValue * RightValue; 1390b94ba42SJung-uk Kim break; 1400b94ba42SJung-uk Kim 141d052a1ccSJung-uk Kim case EXPOP_DIVIDE: 142d052a1ccSJung-uk Kim if (!RightValue) 1430b94ba42SJung-uk Kim { 144d052a1ccSJung-uk Kim DtError (ASL_ERROR, ASL_MSG_DIVIDE_BY_ZERO, 145*4c52cad2SJung-uk Kim Gbl_CurrentField, NULL); 1460b94ba42SJung-uk Kim return (0); 1470b94ba42SJung-uk Kim } 148d052a1ccSJung-uk Kim Result = LeftValue / RightValue; 1490b94ba42SJung-uk Kim break; 1500b94ba42SJung-uk Kim 151d052a1ccSJung-uk Kim case EXPOP_MODULO: 152d052a1ccSJung-uk Kim if (!RightValue) 1530b94ba42SJung-uk Kim { 154d052a1ccSJung-uk Kim DtError (ASL_ERROR, ASL_MSG_DIVIDE_BY_ZERO, 155*4c52cad2SJung-uk Kim Gbl_CurrentField, NULL); 1560b94ba42SJung-uk Kim return (0); 1570b94ba42SJung-uk Kim } 158d052a1ccSJung-uk Kim Result = LeftValue % RightValue; 159d052a1ccSJung-uk Kim break; 160d052a1ccSJung-uk Kim 161d052a1ccSJung-uk Kim case EXPOP_ADD: 162d052a1ccSJung-uk Kim Result = LeftValue + RightValue; 163d052a1ccSJung-uk Kim break; 164d052a1ccSJung-uk Kim 165d052a1ccSJung-uk Kim case EXPOP_SUBTRACT: 166d052a1ccSJung-uk Kim Result = LeftValue - RightValue; 167d052a1ccSJung-uk Kim break; 168d052a1ccSJung-uk Kim 169d052a1ccSJung-uk Kim case EXPOP_SHIFT_RIGHT: 170d052a1ccSJung-uk Kim Result = LeftValue >> RightValue; 171d052a1ccSJung-uk Kim break; 172d052a1ccSJung-uk Kim 173d052a1ccSJung-uk Kim case EXPOP_SHIFT_LEFT: 174d052a1ccSJung-uk Kim Result = LeftValue << RightValue; 175d052a1ccSJung-uk Kim break; 176d052a1ccSJung-uk Kim 177d052a1ccSJung-uk Kim case EXPOP_LESS: 178d052a1ccSJung-uk Kim Result = LeftValue < RightValue; 179d052a1ccSJung-uk Kim break; 180d052a1ccSJung-uk Kim 181d052a1ccSJung-uk Kim case EXPOP_GREATER: 182d052a1ccSJung-uk Kim Result = LeftValue > RightValue; 183d052a1ccSJung-uk Kim break; 184d052a1ccSJung-uk Kim 185d052a1ccSJung-uk Kim case EXPOP_LESS_EQUAL: 186d052a1ccSJung-uk Kim Result = LeftValue <= RightValue; 187d052a1ccSJung-uk Kim break; 188d052a1ccSJung-uk Kim 189d052a1ccSJung-uk Kim case EXPOP_GREATER_EQUAL: 190d052a1ccSJung-uk Kim Result = LeftValue >= RightValue; 191d052a1ccSJung-uk Kim break; 192d052a1ccSJung-uk Kim 193d052a1ccSJung-uk Kim case EXPOP_EQUAL: 194*4c52cad2SJung-uk Kim Result = LeftValue == RightValue; 195d052a1ccSJung-uk Kim break; 196d052a1ccSJung-uk Kim 197d052a1ccSJung-uk Kim case EXPOP_NOT_EQUAL: 198d052a1ccSJung-uk Kim Result = LeftValue != RightValue; 199d052a1ccSJung-uk Kim break; 200d052a1ccSJung-uk Kim 201d052a1ccSJung-uk Kim case EXPOP_AND: 202d052a1ccSJung-uk Kim Result = LeftValue & RightValue; 203d052a1ccSJung-uk Kim break; 204d052a1ccSJung-uk Kim 205d052a1ccSJung-uk Kim case EXPOP_XOR: 206d052a1ccSJung-uk Kim Result = LeftValue ^ RightValue; 207d052a1ccSJung-uk Kim break; 208d052a1ccSJung-uk Kim 209d052a1ccSJung-uk Kim case EXPOP_OR: 210d052a1ccSJung-uk Kim Result = LeftValue | RightValue; 211d052a1ccSJung-uk Kim break; 212d052a1ccSJung-uk Kim 213d052a1ccSJung-uk Kim case EXPOP_LOGICAL_AND: 214d052a1ccSJung-uk Kim Result = LeftValue && RightValue; 215d052a1ccSJung-uk Kim break; 216d052a1ccSJung-uk Kim 217d052a1ccSJung-uk Kim case EXPOP_LOGICAL_OR: 218d052a1ccSJung-uk Kim Result = LeftValue || RightValue; 2190b94ba42SJung-uk Kim break; 2200b94ba42SJung-uk Kim 2210b94ba42SJung-uk Kim default: 2220b94ba42SJung-uk Kim 2230b94ba42SJung-uk Kim /* Unknown operator */ 2240b94ba42SJung-uk Kim 225d052a1ccSJung-uk Kim DtFatal (ASL_MSG_INVALID_EXPRESSION, 226*4c52cad2SJung-uk Kim Gbl_CurrentField, NULL); 227d052a1ccSJung-uk Kim return (0); 2280b94ba42SJung-uk Kim } 2290b94ba42SJung-uk Kim 230d052a1ccSJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 231*4c52cad2SJung-uk Kim "IntegerEval: (%8.8X%8.8X %s %8.8X%8.8X) = %8.8X%8.8X\n", 232d052a1ccSJung-uk Kim ACPI_FORMAT_UINT64 (LeftValue), 233d052a1ccSJung-uk Kim DtGetOpName (Operator), 234d052a1ccSJung-uk Kim ACPI_FORMAT_UINT64 (RightValue), 235d052a1ccSJung-uk Kim ACPI_FORMAT_UINT64 (Result)); 236d052a1ccSJung-uk Kim 237d052a1ccSJung-uk Kim return (Result); 2380b94ba42SJung-uk Kim } 2390b94ba42SJung-uk Kim 2400b94ba42SJung-uk Kim 2410b94ba42SJung-uk Kim /****************************************************************************** 2420b94ba42SJung-uk Kim * 243d052a1ccSJung-uk Kim * FUNCTION: DtResolveLabel 2440b94ba42SJung-uk Kim * 245d052a1ccSJung-uk Kim * PARAMETERS: LabelString - Contains the label 2460b94ba42SJung-uk Kim * 247d052a1ccSJung-uk Kim * RETURN: Table offset associated with the label 2480b94ba42SJung-uk Kim * 249d052a1ccSJung-uk Kim * DESCRIPTION: Lookup a lable and return its value. 2500b94ba42SJung-uk Kim * 2510b94ba42SJung-uk Kim *****************************************************************************/ 2520b94ba42SJung-uk Kim 253d052a1ccSJung-uk Kim UINT64 254d052a1ccSJung-uk Kim DtResolveLabel ( 255d052a1ccSJung-uk Kim char *LabelString) 2560b94ba42SJung-uk Kim { 2570b94ba42SJung-uk Kim DT_FIELD *LabelField; 2580b94ba42SJung-uk Kim 2590b94ba42SJung-uk Kim 260d052a1ccSJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, "Resolve Label: %s\n", LabelString); 2610b94ba42SJung-uk Kim 2620b94ba42SJung-uk Kim /* Resolve a label reference to an integer (table offset) */ 2630b94ba42SJung-uk Kim 264d052a1ccSJung-uk Kim if (*LabelString != '$') 2650b94ba42SJung-uk Kim { 266d052a1ccSJung-uk Kim return (0); 267d052a1ccSJung-uk Kim } 268d052a1ccSJung-uk Kim 269d052a1ccSJung-uk Kim LabelField = DtLookupLabel (LabelString); 2700b94ba42SJung-uk Kim if (!LabelField) 2710b94ba42SJung-uk Kim { 272d052a1ccSJung-uk Kim DtError (ASL_ERROR, ASL_MSG_UNKNOWN_LABEL, 273d052a1ccSJung-uk Kim Gbl_CurrentField, LabelString); 2740b94ba42SJung-uk Kim return (0); 2750b94ba42SJung-uk Kim } 2760b94ba42SJung-uk Kim 2770b94ba42SJung-uk Kim /* All we need from the label is the offset in the table */ 2780b94ba42SJung-uk Kim 279d052a1ccSJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, "Resolved Label: 0x%8.8X\n", 280d052a1ccSJung-uk Kim LabelField->TableOffset); 2810b94ba42SJung-uk Kim 282d052a1ccSJung-uk Kim return (LabelField->TableOffset); 2830b94ba42SJung-uk Kim } 2840b94ba42SJung-uk Kim 2850b94ba42SJung-uk Kim 2860b94ba42SJung-uk Kim /****************************************************************************** 2870b94ba42SJung-uk Kim * 2880b94ba42SJung-uk Kim * FUNCTION: DtDetectAllLabels 2890b94ba42SJung-uk Kim * 2900b94ba42SJung-uk Kim * PARAMETERS: FieldList - Field object at start of generic list 2910b94ba42SJung-uk Kim * 2920b94ba42SJung-uk Kim * RETURN: None 2930b94ba42SJung-uk Kim * 2940b94ba42SJung-uk Kim * DESCRIPTION: Detect all labels in a list of "generic" opcodes (such as 2950b94ba42SJung-uk Kim * a UEFI table.) and insert them into the global label list. 2960b94ba42SJung-uk Kim * 2970b94ba42SJung-uk Kim *****************************************************************************/ 2980b94ba42SJung-uk Kim 2990b94ba42SJung-uk Kim void 3000b94ba42SJung-uk Kim DtDetectAllLabels ( 3010b94ba42SJung-uk Kim DT_FIELD *FieldList) 3020b94ba42SJung-uk Kim { 3030b94ba42SJung-uk Kim ACPI_DMTABLE_INFO *Info; 3040b94ba42SJung-uk Kim DT_FIELD *GenericField; 3050b94ba42SJung-uk Kim UINT32 TableOffset; 3060b94ba42SJung-uk Kim 3070b94ba42SJung-uk Kim 3080b94ba42SJung-uk Kim TableOffset = Gbl_CurrentTableOffset; 3090b94ba42SJung-uk Kim GenericField = FieldList; 3100b94ba42SJung-uk Kim 3110b94ba42SJung-uk Kim /* 3120b94ba42SJung-uk Kim * Process all "Label:" fields within the parse tree. We need 3130b94ba42SJung-uk Kim * to know the offsets for all labels before we can compile 3140b94ba42SJung-uk Kim * the parse tree in order to handle forward references. Traverse 3150b94ba42SJung-uk Kim * tree and get/set all field lengths of all operators in order to 3160b94ba42SJung-uk Kim * determine the label offsets. 3170b94ba42SJung-uk Kim */ 3180b94ba42SJung-uk Kim while (GenericField) 3190b94ba42SJung-uk Kim { 3200b94ba42SJung-uk Kim Info = DtGetGenericTableInfo (GenericField->Name); 3210b94ba42SJung-uk Kim if (Info) 3220b94ba42SJung-uk Kim { 3230b94ba42SJung-uk Kim /* Maintain table offsets */ 3240b94ba42SJung-uk Kim 3250b94ba42SJung-uk Kim GenericField->TableOffset = TableOffset; 3260b94ba42SJung-uk Kim TableOffset += DtGetFieldLength (GenericField, Info); 3270b94ba42SJung-uk Kim 3280b94ba42SJung-uk Kim /* Insert all labels in the global label list */ 3290b94ba42SJung-uk Kim 3300b94ba42SJung-uk Kim if (Info->Opcode == ACPI_DMT_LABEL) 3310b94ba42SJung-uk Kim { 3320b94ba42SJung-uk Kim DtInsertLabelField (GenericField); 3330b94ba42SJung-uk Kim } 3340b94ba42SJung-uk Kim } 3350b94ba42SJung-uk Kim 3360b94ba42SJung-uk Kim GenericField = GenericField->Next; 3370b94ba42SJung-uk Kim } 3380b94ba42SJung-uk Kim } 3390b94ba42SJung-uk Kim 3400b94ba42SJung-uk Kim 3410b94ba42SJung-uk Kim /****************************************************************************** 3420b94ba42SJung-uk Kim * 3430b94ba42SJung-uk Kim * FUNCTION: DtInsertLabelField 3440b94ba42SJung-uk Kim * 3450b94ba42SJung-uk Kim * PARAMETERS: Field - Field object with Label to be inserted 3460b94ba42SJung-uk Kim * 3470b94ba42SJung-uk Kim * RETURN: None 3480b94ba42SJung-uk Kim * 3490b94ba42SJung-uk Kim * DESCRIPTION: Insert a label field into the global label list 3500b94ba42SJung-uk Kim * 3510b94ba42SJung-uk Kim *****************************************************************************/ 3520b94ba42SJung-uk Kim 3530b94ba42SJung-uk Kim static void 3540b94ba42SJung-uk Kim DtInsertLabelField ( 3550b94ba42SJung-uk Kim DT_FIELD *Field) 3560b94ba42SJung-uk Kim { 3570b94ba42SJung-uk Kim 3580b94ba42SJung-uk Kim DbgPrint (ASL_DEBUG_OUTPUT, 3590b94ba42SJung-uk Kim "DtInsertLabelField: Found Label : %s at output table offset %X\n", 3600b94ba42SJung-uk Kim Field->Value, Field->TableOffset); 3610b94ba42SJung-uk Kim 3620b94ba42SJung-uk Kim Field->NextLabel = Gbl_LabelList; 3630b94ba42SJung-uk Kim Gbl_LabelList = Field; 3640b94ba42SJung-uk Kim } 3650b94ba42SJung-uk Kim 3660b94ba42SJung-uk Kim 3670b94ba42SJung-uk Kim /****************************************************************************** 3680b94ba42SJung-uk Kim * 3690b94ba42SJung-uk Kim * FUNCTION: DtLookupLabel 3700b94ba42SJung-uk Kim * 3710b94ba42SJung-uk Kim * PARAMETERS: Name - Label to be resolved 3720b94ba42SJung-uk Kim * 3730b94ba42SJung-uk Kim * RETURN: Field object associated with the label 3740b94ba42SJung-uk Kim * 3750b94ba42SJung-uk Kim * DESCRIPTION: Lookup a label in the global label list. Used during the 3760b94ba42SJung-uk Kim * resolution of integer expressions. 3770b94ba42SJung-uk Kim * 3780b94ba42SJung-uk Kim *****************************************************************************/ 3790b94ba42SJung-uk Kim 3800b94ba42SJung-uk Kim static DT_FIELD * 3810b94ba42SJung-uk Kim DtLookupLabel ( 3820b94ba42SJung-uk Kim char *Name) 3830b94ba42SJung-uk Kim { 3840b94ba42SJung-uk Kim DT_FIELD *LabelField; 3850b94ba42SJung-uk Kim 3860b94ba42SJung-uk Kim 3870b94ba42SJung-uk Kim /* Skip a leading $ */ 3880b94ba42SJung-uk Kim 3890b94ba42SJung-uk Kim if (*Name == '$') 3900b94ba42SJung-uk Kim { 3910b94ba42SJung-uk Kim Name++; 3920b94ba42SJung-uk Kim } 3930b94ba42SJung-uk Kim 3940b94ba42SJung-uk Kim /* Search global list */ 3950b94ba42SJung-uk Kim 3960b94ba42SJung-uk Kim LabelField = Gbl_LabelList; 3970b94ba42SJung-uk Kim while (LabelField) 3980b94ba42SJung-uk Kim { 3990b94ba42SJung-uk Kim if (!ACPI_STRCMP (Name, LabelField->Value)) 4000b94ba42SJung-uk Kim { 4010b94ba42SJung-uk Kim return (LabelField); 4020b94ba42SJung-uk Kim } 4030b94ba42SJung-uk Kim LabelField = LabelField->NextLabel; 4040b94ba42SJung-uk Kim } 4050b94ba42SJung-uk Kim 4060b94ba42SJung-uk Kim return (NULL); 4070b94ba42SJung-uk Kim } 408