Home | History | Annotate | Line # | Download | only in tables
tbdata.c revision 1.5
      1 /******************************************************************************
      2  *
      3  * Module Name: tbdata - Table manager data structure functions
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2016, Intel Corp.
      9  * All rights reserved.
     10  *
     11  * Redistribution and use in source and binary forms, with or without
     12  * modification, are permitted provided that the following conditions
     13  * are met:
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions, and the following disclaimer,
     16  *    without modification.
     17  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18  *    substantially similar to the "NO WARRANTY" disclaimer below
     19  *    ("Disclaimer") and any redistribution must be conditioned upon
     20  *    including a substantially similar Disclaimer requirement for further
     21  *    binary redistribution.
     22  * 3. Neither the names of the above-listed copyright holders nor the names
     23  *    of any contributors may be used to endorse or promote products derived
     24  *    from this software without specific prior written permission.
     25  *
     26  * Alternatively, this software may be distributed under the terms of the
     27  * GNU General Public License ("GPL") version 2 as published by the Free
     28  * Software Foundation.
     29  *
     30  * NO WARRANTY
     31  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41  * POSSIBILITY OF SUCH DAMAGES.
     42  */
     43 
     44 #include "acpi.h"
     45 #include "accommon.h"
     46 #include "acnamesp.h"
     47 #include "actables.h"
     48 
     49 #define _COMPONENT          ACPI_TABLES
     50         ACPI_MODULE_NAME    ("tbdata")
     51 
     52 
     53 /*******************************************************************************
     54  *
     55  * FUNCTION:    AcpiTbInitTableDescriptor
     56  *
     57  * PARAMETERS:  TableDesc               - Table descriptor
     58  *              Address                 - Physical address of the table
     59  *              Flags                   - Allocation flags of the table
     60  *              Table                   - Pointer to the table
     61  *
     62  * RETURN:      None
     63  *
     64  * DESCRIPTION: Initialize a new table descriptor
     65  *
     66  ******************************************************************************/
     67 
     68 void
     69 AcpiTbInitTableDescriptor (
     70     ACPI_TABLE_DESC         *TableDesc,
     71     ACPI_PHYSICAL_ADDRESS   Address,
     72     UINT8                   Flags,
     73     ACPI_TABLE_HEADER       *Table)
     74 {
     75 
     76     /*
     77      * Initialize the table descriptor. Set the pointer to NULL, since the
     78      * table is not fully mapped at this time.
     79      */
     80     memset (TableDesc, 0, sizeof (ACPI_TABLE_DESC));
     81     TableDesc->Address = Address;
     82     TableDesc->Length = Table->Length;
     83     TableDesc->Flags = Flags;
     84     ACPI_MOVE_32_TO_32 (TableDesc->Signature.Ascii, Table->Signature);
     85 }
     86 
     87 
     88 /*******************************************************************************
     89  *
     90  * FUNCTION:    AcpiTbAcquireTable
     91  *
     92  * PARAMETERS:  TableDesc           - Table descriptor
     93  *              TablePtr            - Where table is returned
     94  *              TableLength         - Where table length is returned
     95  *              TableFlags          - Where table allocation flags are returned
     96  *
     97  * RETURN:      Status
     98  *
     99  * DESCRIPTION: Acquire an ACPI table. It can be used for tables not
    100  *              maintained in the AcpiGbl_RootTableList.
    101  *
    102  ******************************************************************************/
    103 
    104 ACPI_STATUS
    105 AcpiTbAcquireTable (
    106     ACPI_TABLE_DESC         *TableDesc,
    107     ACPI_TABLE_HEADER       **TablePtr,
    108     UINT32                  *TableLength,
    109     UINT8                   *TableFlags)
    110 {
    111     ACPI_TABLE_HEADER       *Table = NULL;
    112 
    113 
    114     switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
    115     {
    116     case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
    117 
    118         Table = AcpiOsMapMemory (TableDesc->Address, TableDesc->Length);
    119         break;
    120 
    121     case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
    122     case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
    123 
    124         Table = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
    125             ACPI_PHYSADDR_TO_PTR (TableDesc->Address));
    126         break;
    127 
    128     default:
    129 
    130         break;
    131     }
    132 
    133     /* Table is not valid yet */
    134 
    135     if (!Table)
    136     {
    137         return (AE_NO_MEMORY);
    138     }
    139 
    140     /* Fill the return values */
    141 
    142     *TablePtr = Table;
    143     *TableLength = TableDesc->Length;
    144     *TableFlags = TableDesc->Flags;
    145     return (AE_OK);
    146 }
    147 
    148 
    149 /*******************************************************************************
    150  *
    151  * FUNCTION:    AcpiTbReleaseTable
    152  *
    153  * PARAMETERS:  Table               - Pointer for the table
    154  *              TableLength         - Length for the table
    155  *              TableFlags          - Allocation flags for the table
    156  *
    157  * RETURN:      None
    158  *
    159  * DESCRIPTION: Release a table. The inverse of AcpiTbAcquireTable().
    160  *
    161  ******************************************************************************/
    162 
    163 void
    164 AcpiTbReleaseTable (
    165     ACPI_TABLE_HEADER       *Table,
    166     UINT32                  TableLength,
    167     UINT8                   TableFlags)
    168 {
    169 
    170     switch (TableFlags & ACPI_TABLE_ORIGIN_MASK)
    171     {
    172     case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
    173 
    174         AcpiOsUnmapMemory (Table, TableLength);
    175         break;
    176 
    177     case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
    178     case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
    179     default:
    180 
    181         break;
    182     }
    183 }
    184 
    185 
    186 /*******************************************************************************
    187  *
    188  * FUNCTION:    AcpiTbAcquireTempTable
    189  *
    190  * PARAMETERS:  TableDesc           - Table descriptor to be acquired
    191  *              Address             - Address of the table
    192  *              Flags               - Allocation flags of the table
    193  *
    194  * RETURN:      Status
    195  *
    196  * DESCRIPTION: This function validates the table header to obtain the length
    197  *              of a table and fills the table descriptor to make its state as
    198  *              "INSTALLED". Such a table descriptor is only used for verified
    199  *              installation.
    200  *
    201  ******************************************************************************/
    202 
    203 ACPI_STATUS
    204 AcpiTbAcquireTempTable (
    205     ACPI_TABLE_DESC         *TableDesc,
    206     ACPI_PHYSICAL_ADDRESS   Address,
    207     UINT8                   Flags)
    208 {
    209     ACPI_TABLE_HEADER       *TableHeader;
    210 
    211 
    212     switch (Flags & ACPI_TABLE_ORIGIN_MASK)
    213     {
    214     case ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL:
    215 
    216         /* Get the length of the full table from the header */
    217 
    218         TableHeader = AcpiOsMapMemory (Address, sizeof (ACPI_TABLE_HEADER));
    219         if (!TableHeader)
    220         {
    221             return (AE_NO_MEMORY);
    222         }
    223 
    224         AcpiTbInitTableDescriptor (TableDesc, Address, Flags, TableHeader);
    225         AcpiOsUnmapMemory (TableHeader, sizeof (ACPI_TABLE_HEADER));
    226         return (AE_OK);
    227 
    228     case ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL:
    229     case ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL:
    230 
    231         TableHeader = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
    232             ACPI_PHYSADDR_TO_PTR (Address));
    233         if (!TableHeader)
    234         {
    235             return (AE_NO_MEMORY);
    236         }
    237 
    238         AcpiTbInitTableDescriptor (TableDesc, Address, Flags, TableHeader);
    239         return (AE_OK);
    240 
    241     default:
    242 
    243         break;
    244     }
    245 
    246     /* Table is not valid yet */
    247 
    248     return (AE_NO_MEMORY);
    249 }
    250 
    251 
    252 /*******************************************************************************
    253  *
    254  * FUNCTION:    AcpiTbReleaseTempTable
    255  *
    256  * PARAMETERS:  TableDesc           - Table descriptor to be released
    257  *
    258  * RETURN:      Status
    259  *
    260  * DESCRIPTION: The inverse of AcpiTbAcquireTempTable().
    261  *
    262  *****************************************************************************/
    263 
    264 void
    265 AcpiTbReleaseTempTable (
    266     ACPI_TABLE_DESC         *TableDesc)
    267 {
    268 
    269     /*
    270      * Note that the .Address is maintained by the callers of
    271      * AcpiTbAcquireTempTable(), thus do not invoke AcpiTbUninstallTable()
    272      * where .Address will be freed.
    273      */
    274     AcpiTbInvalidateTable (TableDesc);
    275 }
    276 
    277 
    278 /******************************************************************************
    279  *
    280  * FUNCTION:    AcpiTbValidateTable
    281  *
    282  * PARAMETERS:  TableDesc           - Table descriptor
    283  *
    284  * RETURN:      Status
    285  *
    286  * DESCRIPTION: This function is called to validate the table, the returned
    287  *              table descriptor is in "VALIDATED" state.
    288  *
    289  *****************************************************************************/
    290 
    291 ACPI_STATUS
    292 AcpiTbValidateTable (
    293     ACPI_TABLE_DESC         *TableDesc)
    294 {
    295     ACPI_STATUS             Status = AE_OK;
    296 
    297 
    298     ACPI_FUNCTION_TRACE (TbValidateTable);
    299 
    300 
    301     /* Validate the table if necessary */
    302 
    303     if (!TableDesc->Pointer)
    304     {
    305         Status = AcpiTbAcquireTable (TableDesc, &TableDesc->Pointer,
    306             &TableDesc->Length, &TableDesc->Flags);
    307         if (!TableDesc->Pointer)
    308         {
    309             Status = AE_NO_MEMORY;
    310         }
    311     }
    312 
    313     return_ACPI_STATUS (Status);
    314 }
    315 
    316 
    317 /*******************************************************************************
    318  *
    319  * FUNCTION:    AcpiTbInvalidateTable
    320  *
    321  * PARAMETERS:  TableDesc           - Table descriptor
    322  *
    323  * RETURN:      None
    324  *
    325  * DESCRIPTION: Invalidate one internal ACPI table, this is the inverse of
    326  *              AcpiTbValidateTable().
    327  *
    328  ******************************************************************************/
    329 
    330 void
    331 AcpiTbInvalidateTable (
    332     ACPI_TABLE_DESC         *TableDesc)
    333 {
    334 
    335     ACPI_FUNCTION_TRACE (TbInvalidateTable);
    336 
    337 
    338     /* Table must be validated */
    339 
    340     if (!TableDesc->Pointer)
    341     {
    342         return_VOID;
    343     }
    344 
    345     AcpiTbReleaseTable (TableDesc->Pointer, TableDesc->Length,
    346         TableDesc->Flags);
    347     TableDesc->Pointer = NULL;
    348 
    349     return_VOID;
    350 }
    351 
    352 
    353 /******************************************************************************
    354  *
    355  * FUNCTION:    AcpiTbValidateTempTable
    356  *
    357  * PARAMETERS:  TableDesc           - Table descriptor
    358  *
    359  * RETURN:      Status
    360  *
    361  * DESCRIPTION: This function is called to validate the table, the returned
    362  *              table descriptor is in "VALIDATED" state.
    363  *
    364  *****************************************************************************/
    365 
    366 ACPI_STATUS
    367 AcpiTbValidateTempTable (
    368     ACPI_TABLE_DESC         *TableDesc)
    369 {
    370 
    371     if (!TableDesc->Pointer && !AcpiGbl_VerifyTableChecksum)
    372     {
    373         /*
    374          * Only validates the header of the table.
    375          * Note that Length contains the size of the mapping after invoking
    376          * this work around, this value is required by
    377          * AcpiTbReleaseTempTable().
    378          * We can do this because in AcpiInitTableDescriptor(), the Length
    379          * field of the installed descriptor is filled with the actual
    380          * table length obtaining from the table header.
    381          */
    382         TableDesc->Length = sizeof (ACPI_TABLE_HEADER);
    383     }
    384 
    385     return (AcpiTbValidateTable (TableDesc));
    386 }
    387 
    388 
    389 /******************************************************************************
    390  *
    391  * FUNCTION:    AcpiTbVerifyTempTable
    392  *
    393  * PARAMETERS:  TableDesc           - Table descriptor
    394  *              Signature           - Table signature to verify
    395  *
    396  * RETURN:      Status
    397  *
    398  * DESCRIPTION: This function is called to validate and verify the table, the
    399  *              returned table descriptor is in "VALIDATED" state.
    400  *
    401  *****************************************************************************/
    402 
    403 ACPI_STATUS
    404 AcpiTbVerifyTempTable (
    405     ACPI_TABLE_DESC         *TableDesc,
    406     const char              *Signature)
    407 {
    408     ACPI_STATUS             Status = AE_OK;
    409 
    410 
    411     ACPI_FUNCTION_TRACE (TbVerifyTempTable);
    412 
    413 
    414     /* Validate the table */
    415 
    416     Status = AcpiTbValidateTempTable (TableDesc);
    417     if (ACPI_FAILURE (Status))
    418     {
    419         return_ACPI_STATUS (AE_NO_MEMORY);
    420     }
    421 
    422     /* If a particular signature is expected (DSDT/FACS), it must match */
    423 
    424     if (Signature &&
    425         !ACPI_COMPARE_NAME (&TableDesc->Signature, Signature))
    426     {
    427         ACPI_BIOS_ERROR ((AE_INFO,
    428             "Invalid signature 0x%X for ACPI table, expected [%s]",
    429             TableDesc->Signature.Integer, Signature));
    430         Status = AE_BAD_SIGNATURE;
    431         goto InvalidateAndExit;
    432     }
    433 
    434     /* Verify the checksum */
    435 
    436     if (AcpiGbl_VerifyTableChecksum)
    437     {
    438         Status = AcpiTbVerifyChecksum (TableDesc->Pointer, TableDesc->Length);
    439         if (ACPI_FAILURE (Status))
    440         {
    441             ACPI_EXCEPTION ((AE_INFO, AE_NO_MEMORY,
    442                 "%4.4s 0x%8.8X%8.8X"
    443                 " Attempted table install failed",
    444                 AcpiUtValidAcpiName (TableDesc->Signature.Ascii) ?
    445                     TableDesc->Signature.Ascii : "????",
    446                 ACPI_FORMAT_UINT64 (TableDesc->Address)));
    447 
    448             goto InvalidateAndExit;
    449         }
    450     }
    451 
    452     return_ACPI_STATUS (AE_OK);
    453 
    454 InvalidateAndExit:
    455     AcpiTbInvalidateTable (TableDesc);
    456     return_ACPI_STATUS (Status);
    457 }
    458 
    459 
    460 /*******************************************************************************
    461  *
    462  * FUNCTION:    AcpiTbResizeRootTableList
    463  *
    464  * PARAMETERS:  None
    465  *
    466  * RETURN:      Status
    467  *
    468  * DESCRIPTION: Expand the size of global table array
    469  *
    470  ******************************************************************************/
    471 
    472 ACPI_STATUS
    473 AcpiTbResizeRootTableList (
    474     void)
    475 {
    476     ACPI_TABLE_DESC         *Tables;
    477     UINT32                  TableCount;
    478 
    479 
    480     ACPI_FUNCTION_TRACE (TbResizeRootTableList);
    481 
    482 
    483     /* AllowResize flag is a parameter to AcpiInitializeTables */
    484 
    485     if (!(AcpiGbl_RootTableList.Flags & ACPI_ROOT_ALLOW_RESIZE))
    486     {
    487         ACPI_ERROR ((AE_INFO, "Resize of Root Table Array is not allowed"));
    488         return_ACPI_STATUS (AE_SUPPORT);
    489     }
    490 
    491     /* Increase the Table Array size */
    492 
    493     if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
    494     {
    495         TableCount = AcpiGbl_RootTableList.MaxTableCount;
    496     }
    497     else
    498     {
    499         TableCount = AcpiGbl_RootTableList.CurrentTableCount;
    500     }
    501 
    502     Tables = ACPI_ALLOCATE_ZEROED (
    503         ((ACPI_SIZE) TableCount + ACPI_ROOT_TABLE_SIZE_INCREMENT) *
    504         sizeof (ACPI_TABLE_DESC));
    505     if (!Tables)
    506     {
    507         ACPI_ERROR ((AE_INFO, "Could not allocate new root table array"));
    508         return_ACPI_STATUS (AE_NO_MEMORY);
    509     }
    510 
    511     /* Copy and free the previous table array */
    512 
    513     if (AcpiGbl_RootTableList.Tables)
    514     {
    515         memcpy (Tables, AcpiGbl_RootTableList.Tables,
    516             (ACPI_SIZE) TableCount * sizeof (ACPI_TABLE_DESC));
    517 
    518         if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
    519         {
    520             ACPI_FREE (AcpiGbl_RootTableList.Tables);
    521         }
    522     }
    523 
    524     AcpiGbl_RootTableList.Tables = Tables;
    525     AcpiGbl_RootTableList.MaxTableCount =
    526         TableCount + ACPI_ROOT_TABLE_SIZE_INCREMENT;
    527     AcpiGbl_RootTableList.Flags |= ACPI_ROOT_ORIGIN_ALLOCATED;
    528 
    529     return_ACPI_STATUS (AE_OK);
    530 }
    531 
    532 
    533 /*******************************************************************************
    534  *
    535  * FUNCTION:    AcpiTbGetNextTableDescriptor
    536  *
    537  * PARAMETERS:  TableIndex          - Where table index is returned
    538  *              TableDesc           - Where table descriptor is returned
    539  *
    540  * RETURN:      Status and table index/descriptor.
    541  *
    542  * DESCRIPTION: Allocate a new ACPI table entry to the global table list
    543  *
    544  ******************************************************************************/
    545 
    546 ACPI_STATUS
    547 AcpiTbGetNextTableDescriptor (
    548     UINT32                  *TableIndex,
    549     ACPI_TABLE_DESC         **TableDesc)
    550 {
    551     ACPI_STATUS             Status;
    552     UINT32                  i;
    553 
    554 
    555     /* Ensure that there is room for the table in the Root Table List */
    556 
    557     if (AcpiGbl_RootTableList.CurrentTableCount >=
    558         AcpiGbl_RootTableList.MaxTableCount)
    559     {
    560         Status = AcpiTbResizeRootTableList();
    561         if (ACPI_FAILURE (Status))
    562         {
    563             return (Status);
    564         }
    565     }
    566 
    567     i = AcpiGbl_RootTableList.CurrentTableCount;
    568     AcpiGbl_RootTableList.CurrentTableCount++;
    569 
    570     if (TableIndex)
    571     {
    572         *TableIndex = i;
    573     }
    574     if (TableDesc)
    575     {
    576         *TableDesc = &AcpiGbl_RootTableList.Tables[i];
    577     }
    578 
    579     return (AE_OK);
    580 }
    581 
    582 
    583 /*******************************************************************************
    584  *
    585  * FUNCTION:    AcpiTbTerminate
    586  *
    587  * PARAMETERS:  None
    588  *
    589  * RETURN:      None
    590  *
    591  * DESCRIPTION: Delete all internal ACPI tables
    592  *
    593  ******************************************************************************/
    594 
    595 void
    596 AcpiTbTerminate (
    597     void)
    598 {
    599     UINT32                  i;
    600 
    601 
    602     ACPI_FUNCTION_TRACE (TbTerminate);
    603 
    604 
    605     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
    606 
    607     /* Delete the individual tables */
    608 
    609     for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
    610     {
    611         AcpiTbUninstallTable (&AcpiGbl_RootTableList.Tables[i]);
    612     }
    613 
    614     /*
    615      * Delete the root table array if allocated locally. Array cannot be
    616      * mapped, so we don't need to check for that flag.
    617      */
    618     if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
    619     {
    620         ACPI_FREE (AcpiGbl_RootTableList.Tables);
    621     }
    622 
    623     AcpiGbl_RootTableList.Tables = NULL;
    624     AcpiGbl_RootTableList.Flags = 0;
    625     AcpiGbl_RootTableList.CurrentTableCount = 0;
    626 
    627     ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "ACPI Tables freed\n"));
    628 
    629     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
    630     return_VOID;
    631 }
    632 
    633 
    634 /*******************************************************************************
    635  *
    636  * FUNCTION:    AcpiTbDeleteNamespaceByOwner
    637  *
    638  * PARAMETERS:  TableIndex          - Table index
    639  *
    640  * RETURN:      Status
    641  *
    642  * DESCRIPTION: Delete all namespace objects created when this table was loaded.
    643  *
    644  ******************************************************************************/
    645 
    646 ACPI_STATUS
    647 AcpiTbDeleteNamespaceByOwner (
    648     UINT32                  TableIndex)
    649 {
    650     ACPI_OWNER_ID           OwnerId;
    651     ACPI_STATUS             Status;
    652 
    653 
    654     ACPI_FUNCTION_TRACE (TbDeleteNamespaceByOwner);
    655 
    656 
    657     Status = AcpiUtAcquireMutex (ACPI_MTX_TABLES);
    658     if (ACPI_FAILURE (Status))
    659     {
    660         return_ACPI_STATUS (Status);
    661     }
    662 
    663     if (TableIndex >= AcpiGbl_RootTableList.CurrentTableCount)
    664     {
    665         /* The table index does not exist */
    666 
    667         (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
    668         return_ACPI_STATUS (AE_NOT_EXIST);
    669     }
    670 
    671     /* Get the owner ID for this table, used to delete namespace nodes */
    672 
    673     OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
    674     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
    675 
    676     /*
    677      * Need to acquire the namespace writer lock to prevent interference
    678      * with any concurrent namespace walks. The interpreter must be
    679      * released during the deletion since the acquisition of the deletion
    680      * lock may block, and also since the execution of a namespace walk
    681      * must be allowed to use the interpreter.
    682      */
    683     (void) AcpiUtReleaseMutex (ACPI_MTX_INTERPRETER);
    684     Status = AcpiUtAcquireWriteLock (&AcpiGbl_NamespaceRwLock);
    685 
    686     AcpiNsDeleteNamespaceByOwner (OwnerId);
    687     if (ACPI_FAILURE (Status))
    688     {
    689         return_ACPI_STATUS (Status);
    690     }
    691 
    692     AcpiUtReleaseWriteLock (&AcpiGbl_NamespaceRwLock);
    693 
    694     Status = AcpiUtAcquireMutex (ACPI_MTX_INTERPRETER);
    695     return_ACPI_STATUS (Status);
    696 }
    697 
    698 
    699 /*******************************************************************************
    700  *
    701  * FUNCTION:    AcpiTbAllocateOwnerId
    702  *
    703  * PARAMETERS:  TableIndex          - Table index
    704  *
    705  * RETURN:      Status
    706  *
    707  * DESCRIPTION: Allocates OwnerId in TableDesc
    708  *
    709  ******************************************************************************/
    710 
    711 ACPI_STATUS
    712 AcpiTbAllocateOwnerId (
    713     UINT32                  TableIndex)
    714 {
    715     ACPI_STATUS             Status = AE_BAD_PARAMETER;
    716 
    717 
    718     ACPI_FUNCTION_TRACE (TbAllocateOwnerId);
    719 
    720 
    721     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
    722     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
    723     {
    724         Status = AcpiUtAllocateOwnerId (
    725             &(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
    726     }
    727 
    728     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
    729     return_ACPI_STATUS (Status);
    730 }
    731 
    732 
    733 /*******************************************************************************
    734  *
    735  * FUNCTION:    AcpiTbReleaseOwnerId
    736  *
    737  * PARAMETERS:  TableIndex          - Table index
    738  *
    739  * RETURN:      Status
    740  *
    741  * DESCRIPTION: Releases OwnerId in TableDesc
    742  *
    743  ******************************************************************************/
    744 
    745 ACPI_STATUS
    746 AcpiTbReleaseOwnerId (
    747     UINT32                  TableIndex)
    748 {
    749     ACPI_STATUS             Status = AE_BAD_PARAMETER;
    750 
    751 
    752     ACPI_FUNCTION_TRACE (TbReleaseOwnerId);
    753 
    754 
    755     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
    756     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
    757     {
    758         AcpiUtReleaseOwnerId (
    759             &(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
    760         Status = AE_OK;
    761     }
    762 
    763     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
    764     return_ACPI_STATUS (Status);
    765 }
    766 
    767 
    768 /*******************************************************************************
    769  *
    770  * FUNCTION:    AcpiTbGetOwnerId
    771  *
    772  * PARAMETERS:  TableIndex          - Table index
    773  *              OwnerId             - Where the table OwnerId is returned
    774  *
    775  * RETURN:      Status
    776  *
    777  * DESCRIPTION: returns OwnerId for the ACPI table
    778  *
    779  ******************************************************************************/
    780 
    781 ACPI_STATUS
    782 AcpiTbGetOwnerId (
    783     UINT32                  TableIndex,
    784     ACPI_OWNER_ID           *OwnerId)
    785 {
    786     ACPI_STATUS             Status = AE_BAD_PARAMETER;
    787 
    788 
    789     ACPI_FUNCTION_TRACE (TbGetOwnerId);
    790 
    791 
    792     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
    793     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
    794     {
    795         *OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
    796         Status = AE_OK;
    797     }
    798 
    799     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
    800     return_ACPI_STATUS (Status);
    801 }
    802 
    803 
    804 /*******************************************************************************
    805  *
    806  * FUNCTION:    AcpiTbIsTableLoaded
    807  *
    808  * PARAMETERS:  TableIndex          - Index into the root table
    809  *
    810  * RETURN:      Table Loaded Flag
    811  *
    812  ******************************************************************************/
    813 
    814 BOOLEAN
    815 AcpiTbIsTableLoaded (
    816     UINT32                  TableIndex)
    817 {
    818     BOOLEAN                 IsLoaded = FALSE;
    819 
    820 
    821     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
    822     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
    823     {
    824         IsLoaded = (BOOLEAN)
    825             (AcpiGbl_RootTableList.Tables[TableIndex].Flags &
    826             ACPI_TABLE_IS_LOADED);
    827     }
    828 
    829     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
    830     return (IsLoaded);
    831 }
    832 
    833 
    834 /*******************************************************************************
    835  *
    836  * FUNCTION:    AcpiTbSetTableLoadedFlag
    837  *
    838  * PARAMETERS:  TableIndex          - Table index
    839  *              IsLoaded            - TRUE if table is loaded, FALSE otherwise
    840  *
    841  * RETURN:      None
    842  *
    843  * DESCRIPTION: Sets the table loaded flag to either TRUE or FALSE.
    844  *
    845  ******************************************************************************/
    846 
    847 void
    848 AcpiTbSetTableLoadedFlag (
    849     UINT32                  TableIndex,
    850     BOOLEAN                 IsLoaded)
    851 {
    852 
    853     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
    854     if (TableIndex < AcpiGbl_RootTableList.CurrentTableCount)
    855     {
    856         if (IsLoaded)
    857         {
    858             AcpiGbl_RootTableList.Tables[TableIndex].Flags |=
    859                 ACPI_TABLE_IS_LOADED;
    860         }
    861         else
    862         {
    863             AcpiGbl_RootTableList.Tables[TableIndex].Flags &=
    864                 ~ACPI_TABLE_IS_LOADED;
    865         }
    866     }
    867 
    868     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
    869 }
    870