Home | History | Annotate | Line # | Download | only in executer
      1 /******************************************************************************
      2  *
      3  * Module Name: exutils - interpreter/scanner utilities
      4  *
      5  *****************************************************************************/
      6 
      7 /******************************************************************************
      8  *
      9  * 1. Copyright Notice
     10  *
     11  * Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
     12  * All rights reserved.
     13  *
     14  * 2. License
     15  *
     16  * 2.1. This is your license from Intel Corp. under its intellectual property
     17  * rights. You may have additional license terms from the party that provided
     18  * you this software, covering your right to use that party's intellectual
     19  * property rights.
     20  *
     21  * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
     22  * copy of the source code appearing in this file ("Covered Code") an
     23  * irrevocable, perpetual, worldwide license under Intel's copyrights in the
     24  * base code distributed originally by Intel ("Original Intel Code") to copy,
     25  * make derivatives, distribute, use and display any portion of the Covered
     26  * Code in any form, with the right to sublicense such rights; and
     27  *
     28  * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
     29  * license (with the right to sublicense), under only those claims of Intel
     30  * patents that are infringed by the Original Intel Code, to make, use, sell,
     31  * offer to sell, and import the Covered Code and derivative works thereof
     32  * solely to the minimum extent necessary to exercise the above copyright
     33  * license, and in no event shall the patent license extend to any additions
     34  * to or modifications of the Original Intel Code. No other license or right
     35  * is granted directly or by implication, estoppel or otherwise;
     36  *
     37  * The above copyright and patent license is granted only if the following
     38  * conditions are met:
     39  *
     40  * 3. Conditions
     41  *
     42  * 3.1. Redistribution of Source with Rights to Further Distribute Source.
     43  * Redistribution of source code of any substantial portion of the Covered
     44  * Code or modification with rights to further distribute source must include
     45  * the above Copyright Notice, the above License, this list of Conditions,
     46  * and the following Disclaimer and Export Compliance provision. In addition,
     47  * Licensee must cause all Covered Code to which Licensee contributes to
     48  * contain a file documenting the changes Licensee made to create that Covered
     49  * Code and the date of any change. Licensee must include in that file the
     50  * documentation of any changes made by any predecessor Licensee. Licensee
     51  * must include a prominent statement that the modification is derived,
     52  * directly or indirectly, from Original Intel Code.
     53  *
     54  * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
     55  * Redistribution of source code of any substantial portion of the Covered
     56  * Code or modification without rights to further distribute source must
     57  * include the following Disclaimer and Export Compliance provision in the
     58  * documentation and/or other materials provided with distribution. In
     59  * addition, Licensee may not authorize further sublicense of source of any
     60  * portion of the Covered Code, and must include terms to the effect that the
     61  * license from Licensee to its licensee is limited to the intellectual
     62  * property embodied in the software Licensee provides to its licensee, and
     63  * not to intellectual property embodied in modifications its licensee may
     64  * make.
     65  *
     66  * 3.3. Redistribution of Executable. Redistribution in executable form of any
     67  * substantial portion of the Covered Code or modification must reproduce the
     68  * above Copyright Notice, and the following Disclaimer and Export Compliance
     69  * provision in the documentation and/or other materials provided with the
     70  * distribution.
     71  *
     72  * 3.4. Intel retains all right, title, and interest in and to the Original
     73  * Intel Code.
     74  *
     75  * 3.5. Neither the name Intel nor any other trademark owned or controlled by
     76  * Intel shall be used in advertising or otherwise to promote the sale, use or
     77  * other dealings in products derived from or relating to the Covered Code
     78  * without prior written authorization from Intel.
     79  *
     80  * 4. Disclaimer and Export Compliance
     81  *
     82  * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
     83  * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
     84  * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
     85  * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
     86  * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
     87  * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
     88  * PARTICULAR PURPOSE.
     89  *
     90  * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
     91  * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
     92  * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
     93  * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
     94  * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
     95  * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
     96  * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
     97  * LIMITED REMEDY.
     98  *
     99  * 4.3. Licensee shall not export, either directly or indirectly, any of this
    100  * software or system incorporating such software without first obtaining any
    101  * required license or other approval from the U. S. Department of Commerce or
    102  * any other agency or department of the United States Government. In the
    103  * event Licensee exports any such software from the United States or
    104  * re-exports any such software from a foreign destination, Licensee shall
    105  * ensure that the distribution and export/re-export of the software is in
    106  * compliance with all laws, regulations, orders, or other restrictions of the
    107  * U.S. Export Administration Regulations. Licensee agrees that neither it nor
    108  * any of its subsidiaries will export/re-export any technical data, process,
    109  * software, or service, directly or indirectly, to any country for which the
    110  * United States government or any agency thereof requires an export license,
    111  * other governmental approval, or letter of assurance, without first obtaining
    112  * such license, approval or letter.
    113  *
    114  *****************************************************************************
    115  *
    116  * Alternatively, you may choose to be licensed under the terms of the
    117  * following license:
    118  *
    119  * Redistribution and use in source and binary forms, with or without
    120  * modification, are permitted provided that the following conditions
    121  * are met:
    122  * 1. Redistributions of source code must retain the above copyright
    123  *    notice, this list of conditions, and the following disclaimer,
    124  *    without modification.
    125  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
    126  *    substantially similar to the "NO WARRANTY" disclaimer below
    127  *    ("Disclaimer") and any redistribution must be conditioned upon
    128  *    including a substantially similar Disclaimer requirement for further
    129  *    binary redistribution.
    130  * 3. Neither the names of the above-listed copyright holders nor the names
    131  *    of any contributors may be used to endorse or promote products derived
    132  *    from this software without specific prior written permission.
    133  *
    134  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    135  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    136  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    137  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    138  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    139  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    140  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    141  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    142  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    143  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    144  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    145  *
    146  * Alternatively, you may choose to be licensed under the terms of the
    147  * GNU General Public License ("GPL") version 2 as published by the Free
    148  * Software Foundation.
    149  *
    150  *****************************************************************************/
    151 
    152 /*
    153  * DEFINE_AML_GLOBALS is tested in amlcode.h
    154  * to determine whether certain global names should be "defined" or only
    155  * "declared" in the current compilation. This enhances maintainability
    156  * by enabling a single header file to embody all knowledge of the names
    157  * in question.
    158  *
    159  * Exactly one module of any executable should #define DEFINE_GLOBALS
    160  * before #including the header files which use this convention. The
    161  * names in question will be defined and initialized in that module,
    162  * and declared as extern in all other modules which #include those
    163  * header files.
    164  */
    165 
    166 #define DEFINE_AML_GLOBALS
    167 
    168 #include "acpi.h"
    169 #include "accommon.h"
    170 #include "acinterp.h"
    171 #include "amlcode.h"
    172 
    173 #define _COMPONENT          ACPI_EXECUTER
    174         ACPI_MODULE_NAME    ("exutils")
    175 
    176 /* Local prototypes */
    177 
    178 static UINT32
    179 AcpiExDigitsNeeded (
    180     UINT64                  Value,
    181     UINT32                  Base);
    182 
    183 
    184 /*******************************************************************************
    185  *
    186  * FUNCTION:    AcpiExEnterInterpreter
    187  *
    188  * PARAMETERS:  None
    189  *
    190  * RETURN:      None
    191  *
    192  * DESCRIPTION: Enter the interpreter execution region. Failure to enter
    193  *              the interpreter region is a fatal system error. Used in
    194  *              conjunction with ExitInterpreter.
    195  *
    196  ******************************************************************************/
    197 
    198 void
    199 AcpiExEnterInterpreter (
    200     void)
    201 {
    202     ACPI_STATUS             Status;
    203 
    204 
    205     ACPI_FUNCTION_TRACE (ExEnterInterpreter);
    206 
    207 
    208     Status = AcpiUtAcquireMutex (ACPI_MTX_INTERPRETER);
    209     if (ACPI_FAILURE (Status))
    210     {
    211         ACPI_ERROR ((AE_INFO, "Could not acquire AML Interpreter mutex"));
    212     }
    213     Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
    214     if (ACPI_FAILURE (Status))
    215     {
    216         ACPI_ERROR ((AE_INFO, "Could not acquire AML Namespace mutex"));
    217     }
    218 
    219     return_VOID;
    220 }
    221 
    222 
    223 /*******************************************************************************
    224  *
    225  * FUNCTION:    AcpiExExitInterpreter
    226  *
    227  * PARAMETERS:  None
    228  *
    229  * RETURN:      None
    230  *
    231  * DESCRIPTION: Exit the interpreter execution region. This is the top level
    232  *              routine used to exit the interpreter when all processing has
    233  *              been completed, or when the method blocks.
    234  *
    235  * Cases where the interpreter is unlocked internally:
    236  *      1) Method will be blocked on a Sleep() AML opcode
    237  *      2) Method will be blocked on an Acquire() AML opcode
    238  *      3) Method will be blocked on a Wait() AML opcode
    239  *      4) Method will be blocked to acquire the global lock
    240  *      5) Method will be blocked waiting to execute a serialized control
    241  *          method that is currently executing
    242  *      6) About to invoke a user-installed opregion handler
    243  *
    244  ******************************************************************************/
    245 
    246 void
    247 AcpiExExitInterpreter (
    248     void)
    249 {
    250     ACPI_STATUS             Status;
    251 
    252 
    253     ACPI_FUNCTION_TRACE (ExExitInterpreter);
    254 
    255 
    256     Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
    257     if (ACPI_FAILURE (Status))
    258     {
    259         ACPI_ERROR ((AE_INFO, "Could not release AML Namespace mutex"));
    260     }
    261     Status = AcpiUtReleaseMutex (ACPI_MTX_INTERPRETER);
    262     if (ACPI_FAILURE (Status))
    263     {
    264         ACPI_ERROR ((AE_INFO, "Could not release AML Interpreter mutex"));
    265     }
    266 
    267     return_VOID;
    268 }
    269 
    270 
    271 /*******************************************************************************
    272  *
    273  * FUNCTION:    AcpiExTruncateFor32bitTable
    274  *
    275  * PARAMETERS:  ObjDesc         - Object to be truncated
    276  *
    277  * RETURN:      TRUE if a truncation was performed, FALSE otherwise.
    278  *
    279  * DESCRIPTION: Truncate an ACPI Integer to 32 bits if the execution mode is
    280  *              32-bit, as determined by the revision of the DSDT.
    281  *
    282  ******************************************************************************/
    283 
    284 BOOLEAN
    285 AcpiExTruncateFor32bitTable (
    286     ACPI_OPERAND_OBJECT     *ObjDesc)
    287 {
    288 
    289     ACPI_FUNCTION_ENTRY ();
    290 
    291 
    292     /*
    293      * Object must be a valid number and we must be executing
    294      * a control method. Object could be NS node for AML_INT_NAMEPATH_OP.
    295      */
    296     if ((!ObjDesc) ||
    297         (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) ||
    298         (ObjDesc->Common.Type != ACPI_TYPE_INTEGER))
    299     {
    300         return (FALSE);
    301     }
    302 
    303     if ((AcpiGbl_IntegerByteWidth == 4) &&
    304         (ObjDesc->Integer.Value > (UINT64) ACPI_UINT32_MAX))
    305     {
    306         /*
    307          * We are executing in a 32-bit ACPI table. Truncate
    308          * the value to 32 bits by zeroing out the upper 32-bit field
    309          */
    310         ObjDesc->Integer.Value &= (UINT64) ACPI_UINT32_MAX;
    311         return (TRUE);
    312     }
    313 
    314     return (FALSE);
    315 }
    316 
    317 
    318 /*******************************************************************************
    319  *
    320  * FUNCTION:    AcpiExAcquireGlobalLock
    321  *
    322  * PARAMETERS:  FieldFlags            - Flags with Lock rule:
    323  *                                      AlwaysLock or NeverLock
    324  *
    325  * RETURN:      None
    326  *
    327  * DESCRIPTION: Obtain the ACPI hardware Global Lock, only if the field
    328  *              flags specify that it is to be obtained before field access.
    329  *
    330  ******************************************************************************/
    331 
    332 void
    333 AcpiExAcquireGlobalLock (
    334     UINT32                  FieldFlags)
    335 {
    336     ACPI_STATUS             Status;
    337 
    338 
    339     ACPI_FUNCTION_TRACE (ExAcquireGlobalLock);
    340 
    341 
    342     /* Only use the lock if the AlwaysLock bit is set */
    343 
    344     if (!(FieldFlags & AML_FIELD_LOCK_RULE_MASK))
    345     {
    346         return_VOID;
    347     }
    348 
    349     /* Attempt to get the global lock, wait forever */
    350 
    351     Status = AcpiExAcquireMutexObject (ACPI_WAIT_FOREVER,
    352         AcpiGbl_GlobalLockMutex, AcpiOsGetThreadId ());
    353 
    354     if (ACPI_FAILURE (Status))
    355     {
    356         ACPI_EXCEPTION ((AE_INFO, Status,
    357             "Could not acquire Global Lock"));
    358     }
    359 
    360     return_VOID;
    361 }
    362 
    363 
    364 /*******************************************************************************
    365  *
    366  * FUNCTION:    AcpiExReleaseGlobalLock
    367  *
    368  * PARAMETERS:  FieldFlags            - Flags with Lock rule:
    369  *                                      AlwaysLock or NeverLock
    370  *
    371  * RETURN:      None
    372  *
    373  * DESCRIPTION: Release the ACPI hardware Global Lock
    374  *
    375  ******************************************************************************/
    376 
    377 void
    378 AcpiExReleaseGlobalLock (
    379     UINT32                  FieldFlags)
    380 {
    381     ACPI_STATUS             Status;
    382 
    383 
    384     ACPI_FUNCTION_TRACE (ExReleaseGlobalLock);
    385 
    386 
    387     /* Only use the lock if the AlwaysLock bit is set */
    388 
    389     if (!(FieldFlags & AML_FIELD_LOCK_RULE_MASK))
    390     {
    391         return_VOID;
    392     }
    393 
    394     /* Release the global lock */
    395 
    396     Status = AcpiExReleaseMutexObject (AcpiGbl_GlobalLockMutex);
    397     if (ACPI_FAILURE (Status))
    398     {
    399         /* Report the error, but there isn't much else we can do */
    400 
    401         ACPI_EXCEPTION ((AE_INFO, Status,
    402             "Could not release Global Lock"));
    403     }
    404 
    405     return_VOID;
    406 }
    407 
    408 
    409 /*******************************************************************************
    410  *
    411  * FUNCTION:    AcpiExDigitsNeeded
    412  *
    413  * PARAMETERS:  Value           - Value to be represented
    414  *              Base            - Base of representation
    415  *
    416  * RETURN:      The number of digits.
    417  *
    418  * DESCRIPTION: Calculate the number of digits needed to represent the Value
    419  *              in the given Base (Radix)
    420  *
    421  ******************************************************************************/
    422 
    423 static UINT32
    424 AcpiExDigitsNeeded (
    425     UINT64                  Value,
    426     UINT32                  Base)
    427 {
    428     UINT32                  NumDigits;
    429     UINT64                  CurrentValue;
    430 
    431 
    432     ACPI_FUNCTION_TRACE (ExDigitsNeeded);
    433 
    434 
    435     /* UINT64 is unsigned, so we don't worry about a '-' prefix */
    436 
    437     if (Value == 0)
    438     {
    439         return_UINT32 (1);
    440     }
    441 
    442     CurrentValue = Value;
    443     NumDigits = 0;
    444 
    445     /* Count the digits in the requested base */
    446 
    447     while (CurrentValue)
    448     {
    449         (void) AcpiUtShortDivide (CurrentValue, Base, &CurrentValue, NULL);
    450         NumDigits++;
    451     }
    452 
    453     return_UINT32 (NumDigits);
    454 }
    455 
    456 
    457 /*******************************************************************************
    458  *
    459  * FUNCTION:    AcpiExEisaIdToString
    460  *
    461  * PARAMETERS:  OutString       - Where to put the converted string (8 bytes)
    462  *              CompressedId    - EISAID to be converted
    463  *
    464  * RETURN:      None
    465  *
    466  * DESCRIPTION: Convert a numeric EISAID to string representation. Return
    467  *              buffer must be large enough to hold the string. The string
    468  *              returned is always exactly of length ACPI_EISAID_STRING_SIZE
    469  *              (includes null terminator). The EISAID is always 32 bits.
    470  *
    471  ******************************************************************************/
    472 
    473 void
    474 AcpiExEisaIdToString (
    475     char                    *OutString,
    476     UINT64                  CompressedId)
    477 {
    478     UINT32                  SwappedId;
    479 
    480 
    481     ACPI_FUNCTION_ENTRY ();
    482 
    483 
    484     /* The EISAID should be a 32-bit integer */
    485 
    486     if (CompressedId > ACPI_UINT32_MAX)
    487     {
    488         ACPI_WARNING ((AE_INFO,
    489             "Expected EISAID is larger than 32 bits: "
    490             "0x%8.8X%8.8X, truncating",
    491             ACPI_FORMAT_UINT64 (CompressedId)));
    492     }
    493 
    494     /* Swap ID to big-endian to get contiguous bits */
    495 
    496     SwappedId = AcpiUtDwordByteSwap ((UINT32) CompressedId);
    497 
    498     /* First 3 bytes are uppercase letters. Next 4 bytes are hexadecimal */
    499 
    500     OutString[0] = (char) (0x40 + (((unsigned long) SwappedId >> 26) & 0x1F));
    501     OutString[1] = (char) (0x40 + ((SwappedId >> 21) & 0x1F));
    502     OutString[2] = (char) (0x40 + ((SwappedId >> 16) & 0x1F));
    503     OutString[3] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 12);
    504     OutString[4] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 8);
    505     OutString[5] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 4);
    506     OutString[6] = AcpiUtHexToAsciiChar ((UINT64) SwappedId, 0);
    507     OutString[7] = 0;
    508 }
    509 
    510 
    511 /*******************************************************************************
    512  *
    513  * FUNCTION:    AcpiExIntegerToString
    514  *
    515  * PARAMETERS:  OutString       - Where to put the converted string. At least
    516  *                                21 bytes are needed to hold the largest
    517  *                                possible 64-bit integer.
    518  *              Value           - Value to be converted
    519  *
    520  * RETURN:      Converted string in OutString
    521  *
    522  * DESCRIPTION: Convert a 64-bit integer to decimal string representation.
    523  *              Assumes string buffer is large enough to hold the string. The
    524  *              largest string is (ACPI_MAX64_DECIMAL_DIGITS + 1).
    525  *
    526  ******************************************************************************/
    527 
    528 void
    529 AcpiExIntegerToString (
    530     char                    *OutString,
    531     UINT64                  Value)
    532 {
    533     UINT32                  Count;
    534     UINT32                  DigitsNeeded;
    535     UINT32                  Remainder;
    536 
    537 
    538     ACPI_FUNCTION_ENTRY ();
    539 
    540 
    541     DigitsNeeded = AcpiExDigitsNeeded (Value, 10);
    542     OutString[DigitsNeeded] = 0;
    543 
    544     for (Count = DigitsNeeded; Count > 0; Count--)
    545     {
    546         (void) AcpiUtShortDivide (Value, 10, &Value, &Remainder);
    547         OutString[Count-1] = (char) ('0' + Remainder);\
    548     }
    549 }
    550 
    551 
    552 /*******************************************************************************
    553  *
    554  * FUNCTION:    AcpiExPciClsToString
    555  *
    556  * PARAMETERS:  OutString       - Where to put the converted string (7 bytes)
    557  *              ClassCode       - PCI class code to be converted (3 bytes)
    558  *
    559  * RETURN:      Converted string in OutString
    560  *
    561  * DESCRIPTION: Convert 3-bytes PCI class code to string representation.
    562  *              Return buffer must be large enough to hold the string. The
    563  *              string returned is always exactly of length
    564  *              ACPI_PCICLS_STRING_SIZE (includes null terminator).
    565  *
    566  ******************************************************************************/
    567 
    568 void
    569 AcpiExPciClsToString (
    570     char                    *OutString,
    571     UINT8                   ClassCode[3])
    572 {
    573 
    574     ACPI_FUNCTION_ENTRY ();
    575 
    576 
    577     /* All 3 bytes are hexadecimal */
    578 
    579     OutString[0] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[0], 4);
    580     OutString[1] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[0], 0);
    581     OutString[2] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[1], 4);
    582     OutString[3] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[1], 0);
    583     OutString[4] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[2], 4);
    584     OutString[5] = AcpiUtHexToAsciiChar ((UINT64) ClassCode[2], 0);
    585     OutString[6] = 0;
    586 }
    587 
    588 
    589 /*******************************************************************************
    590  *
    591  * FUNCTION:    AcpiIsValidSpaceId
    592  *
    593  * PARAMETERS:  SpaceId             - ID to be validated
    594  *
    595  * RETURN:      TRUE if SpaceId is a valid/supported ID.
    596  *
    597  * DESCRIPTION: Validate an operation region SpaceID.
    598  *
    599  ******************************************************************************/
    600 
    601 BOOLEAN
    602 AcpiIsValidSpaceId (
    603     UINT8                   SpaceId)
    604 {
    605 
    606     if ((SpaceId >= ACPI_NUM_PREDEFINED_REGIONS) &&
    607         (SpaceId < ACPI_USER_REGION_BEGIN) &&
    608         (SpaceId != ACPI_ADR_SPACE_DATA_TABLE) &&
    609         (SpaceId != ACPI_ADR_SPACE_FIXED_HARDWARE))
    610     {
    611         return (FALSE);
    612     }
    613 
    614     return (TRUE);
    615 }
    616