xref: /freebsd/sys/contrib/dev/acpica/compiler/dtexpress.c (revision 4c52cad2f9c8cd2b25d156455f9263616da1fb79)
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