Home | History | Annotate | Line # | Download | only in tables
tbxfload.c revision 1.7
      1 /******************************************************************************
      2  *
      3  * Module Name: tbxfload - Table load/unload external interfaces
      4  *
      5  *****************************************************************************/
      6 
      7 /*
      8  * Copyright (C) 2000 - 2017, 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 #define EXPORT_ACPI_INTERFACES
     45 
     46 #include "acpi.h"
     47 #include "accommon.h"
     48 #include "acnamesp.h"
     49 #include "actables.h"
     50 #include "acevents.h"
     51 
     52 #define _COMPONENT          ACPI_TABLES
     53         ACPI_MODULE_NAME    ("tbxfload")
     54 
     55 
     56 /*******************************************************************************
     57  *
     58  * FUNCTION:    AcpiLoadTables
     59  *
     60  * PARAMETERS:  None
     61  *
     62  * RETURN:      Status
     63  *
     64  * DESCRIPTION: Load the ACPI tables from the RSDT/XSDT
     65  *
     66  ******************************************************************************/
     67 
     68 ACPI_STATUS ACPI_INIT_FUNCTION
     69 AcpiLoadTables (
     70     void)
     71 {
     72     ACPI_STATUS             Status;
     73 
     74 
     75     ACPI_FUNCTION_TRACE (AcpiLoadTables);
     76 
     77 
     78     /*
     79      * Install the default operation region handlers. These are the
     80      * handlers that are defined by the ACPI specification to be
     81      * "always accessible" -- namely, SystemMemory, SystemIO, and
     82      * PCI_Config. This also means that no _REG methods need to be
     83      * run for these address spaces. We need to have these handlers
     84      * installed before any AML code can be executed, especially any
     85      * module-level code (11/2015).
     86      * Note that we allow OSPMs to install their own region handlers
     87      * between AcpiInitializeSubsystem() and AcpiLoadTables() to use
     88      * their customized default region handlers.
     89      */
     90     Status = AcpiEvInstallRegionHandlers ();
     91     if (ACPI_FAILURE (Status))
     92     {
     93         ACPI_EXCEPTION ((AE_INFO, Status, "During Region initialization"));
     94         return_ACPI_STATUS (Status);
     95     }
     96 
     97     /* Load the namespace from the tables */
     98 
     99     Status = AcpiTbLoadNamespace ();
    100 
    101     /* Don't let single failures abort the load */
    102 
    103     if (Status == AE_CTRL_TERMINATE)
    104     {
    105         Status = AE_OK;
    106     }
    107 
    108     if (ACPI_FAILURE (Status))
    109     {
    110         ACPI_EXCEPTION ((AE_INFO, Status,
    111             "While loading namespace from ACPI tables"));
    112     }
    113 
    114     if (AcpiGbl_ParseTableAsTermList || !AcpiGbl_GroupModuleLevelCode)
    115     {
    116         /*
    117          * Initialize the objects that remain uninitialized. This
    118          * runs the executable AML that may be part of the
    119          * declaration of these objects:
    120          * OperationRegions, BufferFields, Buffers, and Packages.
    121          */
    122         Status = AcpiNsInitializeObjects ();
    123         if (ACPI_FAILURE (Status))
    124         {
    125             return_ACPI_STATUS (Status);
    126         }
    127     }
    128 
    129     AcpiGbl_NamespaceInitialized = TRUE;
    130     return_ACPI_STATUS (Status);
    131 }
    132 
    133 ACPI_EXPORT_SYMBOL_INIT (AcpiLoadTables)
    134 
    135 
    136 /*******************************************************************************
    137  *
    138  * FUNCTION:    AcpiTbLoadNamespace
    139  *
    140  * PARAMETERS:  None
    141  *
    142  * RETURN:      Status
    143  *
    144  * DESCRIPTION: Load the namespace from the DSDT and all SSDTs/PSDTs found in
    145  *              the RSDT/XSDT.
    146  *
    147  ******************************************************************************/
    148 
    149 ACPI_STATUS
    150 AcpiTbLoadNamespace (
    151     void)
    152 {
    153     ACPI_STATUS             Status;
    154     UINT32                  i;
    155     ACPI_TABLE_HEADER       *NewDsdt;
    156     ACPI_TABLE_DESC         *Table;
    157     UINT32                  TablesLoaded = 0;
    158     UINT32                  TablesFailed = 0;
    159 
    160 
    161     ACPI_FUNCTION_TRACE (TbLoadNamespace);
    162 
    163 
    164     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
    165 
    166 #ifdef __ia64__
    167     /*
    168      * For ia64 ski emulator
    169      */
    170     if (AcpiGbl_DsdtIndex == ACPI_INVALID_TABLE_INDEX)
    171     {
    172         Status = AE_NO_ACPI_TABLES;
    173         goto UnlockAndExit;
    174     }
    175 #endif
    176 
    177     /*
    178      * Load the namespace. The DSDT is required, but any SSDT and
    179      * PSDT tables are optional. Verify the DSDT.
    180      */
    181     Table = &AcpiGbl_RootTableList.Tables[AcpiGbl_DsdtIndex];
    182 
    183     if (!AcpiGbl_RootTableList.CurrentTableCount ||
    184         !ACPI_COMPARE_NAME (Table->Signature.Ascii, ACPI_SIG_DSDT) ||
    185          ACPI_FAILURE (AcpiTbValidateTable (Table)))
    186     {
    187         Status = AE_NO_ACPI_TABLES;
    188         goto UnlockAndExit;
    189     }
    190 
    191     /*
    192      * Save the DSDT pointer for simple access. This is the mapped memory
    193      * address. We must take care here because the address of the .Tables
    194      * array can change dynamically as tables are loaded at run-time. Note:
    195      * .Pointer field is not validated until after call to AcpiTbValidateTable.
    196      */
    197     AcpiGbl_DSDT = Table->Pointer;
    198 
    199     /*
    200      * Optionally copy the entire DSDT to local memory (instead of simply
    201      * mapping it.) There are some BIOSs that corrupt or replace the original
    202      * DSDT, creating the need for this option. Default is FALSE, do not copy
    203      * the DSDT.
    204      */
    205     if (AcpiGbl_CopyDsdtLocally)
    206     {
    207         NewDsdt = AcpiTbCopyDsdt (AcpiGbl_DsdtIndex);
    208         if (NewDsdt)
    209         {
    210             AcpiGbl_DSDT = NewDsdt;
    211         }
    212     }
    213 
    214     /*
    215      * Save the original DSDT header for detection of table corruption
    216      * and/or replacement of the DSDT from outside the OS.
    217      */
    218     memcpy (&AcpiGbl_OriginalDsdtHeader, AcpiGbl_DSDT,
    219         sizeof (ACPI_TABLE_HEADER));
    220 
    221     /* Load and parse tables */
    222 
    223     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
    224     Status = AcpiNsLoadTable (AcpiGbl_DsdtIndex, AcpiGbl_RootNode);
    225     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
    226     if (ACPI_FAILURE (Status))
    227     {
    228         ACPI_EXCEPTION ((AE_INFO, Status, "[DSDT] table load failed"));
    229         TablesFailed++;
    230     }
    231     else
    232     {
    233         TablesLoaded++;
    234     }
    235 
    236     /* Load any SSDT or PSDT tables. Note: Loop leaves tables locked */
    237 
    238     for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; ++i)
    239     {
    240         Table = &AcpiGbl_RootTableList.Tables[i];
    241 
    242         if (!Table->Address ||
    243             (!ACPI_COMPARE_NAME (Table->Signature.Ascii, ACPI_SIG_SSDT) &&
    244              !ACPI_COMPARE_NAME (Table->Signature.Ascii, ACPI_SIG_PSDT) &&
    245              !ACPI_COMPARE_NAME (Table->Signature.Ascii, ACPI_SIG_OSDT)) ||
    246             ACPI_FAILURE (AcpiTbValidateTable (Table)))
    247         {
    248             continue;
    249         }
    250 
    251         /* Ignore errors while loading tables, get as many as possible */
    252 
    253         (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
    254         Status =  AcpiNsLoadTable (i, AcpiGbl_RootNode);
    255         (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
    256         if (ACPI_FAILURE (Status))
    257         {
    258             ACPI_EXCEPTION ((AE_INFO, Status, "(%4.4s:%8.8s) while loading table",
    259                 Table->Signature.Ascii, Table->Pointer->OemTableId));
    260 
    261             TablesFailed++;
    262 
    263             ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
    264                 "Table [%4.4s:%8.8s] (id FF) - Table namespace load failed\n\n",
    265                 Table->Signature.Ascii, Table->Pointer->OemTableId));
    266         }
    267         else
    268         {
    269             TablesLoaded++;
    270         }
    271     }
    272 
    273     if (!TablesFailed)
    274     {
    275         ACPI_INFO ((
    276             "%u ACPI AML tables successfully acquired and loaded",
    277             TablesLoaded));
    278     }
    279     else
    280     {
    281         ACPI_ERROR ((AE_INFO,
    282             "%u table load failures, %u successful",
    283             TablesFailed, TablesLoaded));
    284 
    285         /* Indicate at least one failure */
    286 
    287         Status = AE_CTRL_TERMINATE;
    288     }
    289 
    290 #ifdef ACPI_APPLICATION
    291     ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "\n"));
    292 #endif
    293 
    294 
    295 UnlockAndExit:
    296     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
    297     return_ACPI_STATUS (Status);
    298 }
    299 
    300 
    301 /*******************************************************************************
    302  *
    303  * FUNCTION:    AcpiInstallTable
    304  *
    305  * PARAMETERS:  Address             - Address of the ACPI table to be installed.
    306  *              Physical            - Whether the address is a physical table
    307  *                                    address or not
    308  *
    309  * RETURN:      Status
    310  *
    311  * DESCRIPTION: Dynamically install an ACPI table.
    312  *              Note: This function should only be invoked after
    313  *                    AcpiInitializeTables() and before AcpiLoadTables().
    314  *
    315  ******************************************************************************/
    316 
    317 ACPI_STATUS ACPI_INIT_FUNCTION
    318 AcpiInstallTable (
    319     ACPI_PHYSICAL_ADDRESS   Address,
    320     BOOLEAN                 Physical)
    321 {
    322     ACPI_STATUS             Status;
    323     UINT8                   Flags;
    324     UINT32                  TableIndex;
    325 
    326 
    327     ACPI_FUNCTION_TRACE (AcpiInstallTable);
    328 
    329 
    330     if (Physical)
    331     {
    332         Flags = ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL;
    333     }
    334     else
    335     {
    336         Flags = ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL;
    337     }
    338 
    339     Status = AcpiTbInstallStandardTable (Address, Flags,
    340         FALSE, FALSE, &TableIndex);
    341 
    342     return_ACPI_STATUS (Status);
    343 }
    344 
    345 ACPI_EXPORT_SYMBOL_INIT (AcpiInstallTable)
    346 
    347 
    348 /*******************************************************************************
    349  *
    350  * FUNCTION:    AcpiLoadTable
    351  *
    352  * PARAMETERS:  Table               - Pointer to a buffer containing the ACPI
    353  *                                    table to be loaded.
    354  *
    355  * RETURN:      Status
    356  *
    357  * DESCRIPTION: Dynamically load an ACPI table from the caller's buffer. Must
    358  *              be a valid ACPI table with a valid ACPI table header.
    359  *              Note1: Mainly intended to support hotplug addition of SSDTs.
    360  *              Note2: Does not copy the incoming table. User is responsible
    361  *              to ensure that the table is not deleted or unmapped.
    362  *
    363  ******************************************************************************/
    364 
    365 ACPI_STATUS
    366 AcpiLoadTable (
    367     ACPI_TABLE_HEADER       *Table)
    368 {
    369     ACPI_STATUS             Status;
    370     UINT32                  TableIndex;
    371 
    372 
    373     ACPI_FUNCTION_TRACE (AcpiLoadTable);
    374 
    375 
    376     /* Parameter validation */
    377 
    378     if (!Table)
    379     {
    380         return_ACPI_STATUS (AE_BAD_PARAMETER);
    381     }
    382 
    383     /* Install the table and load it into the namespace */
    384 
    385     ACPI_INFO (("Host-directed Dynamic ACPI Table Load:"));
    386     Status = AcpiTbInstallAndLoadTable (ACPI_PTR_TO_PHYSADDR (Table),
    387         ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL, FALSE, &TableIndex);
    388     return_ACPI_STATUS (Status);
    389 }
    390 
    391 ACPI_EXPORT_SYMBOL (AcpiLoadTable)
    392 
    393 
    394 /*******************************************************************************
    395  *
    396  * FUNCTION:    AcpiUnloadParentTable
    397  *
    398  * PARAMETERS:  Object              - Handle to any namespace object owned by
    399  *                                    the table to be unloaded
    400  *
    401  * RETURN:      Status
    402  *
    403  * DESCRIPTION: Via any namespace object within an SSDT or OEMx table, unloads
    404  *              the table and deletes all namespace objects associated with
    405  *              that table. Unloading of the DSDT is not allowed.
    406  *              Note: Mainly intended to support hotplug removal of SSDTs.
    407  *
    408  ******************************************************************************/
    409 
    410 ACPI_STATUS
    411 AcpiUnloadParentTable (
    412     ACPI_HANDLE             Object)
    413 {
    414     ACPI_NAMESPACE_NODE     *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Object);
    415     ACPI_STATUS             Status = AE_NOT_EXIST;
    416     ACPI_OWNER_ID           OwnerId;
    417     UINT32                  i;
    418 
    419 
    420     ACPI_FUNCTION_TRACE (AcpiUnloadParentTable);
    421 
    422 
    423     /* Parameter validation */
    424 
    425     if (!Object)
    426     {
    427         return_ACPI_STATUS (AE_BAD_PARAMETER);
    428     }
    429 
    430     /*
    431      * The node OwnerId is currently the same as the parent table ID.
    432      * However, this could change in the future.
    433      */
    434     OwnerId = Node->OwnerId;
    435     if (!OwnerId)
    436     {
    437         /* OwnerId==0 means DSDT is the owner. DSDT cannot be unloaded */
    438 
    439         return_ACPI_STATUS (AE_TYPE);
    440     }
    441 
    442     /* Must acquire the table lock during this operation */
    443 
    444     Status = AcpiUtAcquireMutex (ACPI_MTX_TABLES);
    445     if (ACPI_FAILURE (Status))
    446     {
    447         return_ACPI_STATUS (Status);
    448     }
    449 
    450     /* Find the table in the global table list */
    451 
    452     for (i = 0; i < AcpiGbl_RootTableList.CurrentTableCount; i++)
    453     {
    454         if (OwnerId != AcpiGbl_RootTableList.Tables[i].OwnerId)
    455         {
    456             continue;
    457         }
    458 
    459         /*
    460          * Allow unload of SSDT and OEMx tables only. Do not allow unload
    461          * of the DSDT. No other types of tables should get here, since
    462          * only these types can contain AML and thus are the only types
    463          * that can create namespace objects.
    464          */
    465         if (ACPI_COMPARE_NAME (
    466                 AcpiGbl_RootTableList.Tables[i].Signature.Ascii,
    467                 ACPI_SIG_DSDT))
    468         {
    469             Status = AE_TYPE;
    470             break;
    471         }
    472 
    473         (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
    474         Status = AcpiTbUnloadTable (i);
    475         (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
    476         break;
    477     }
    478 
    479     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
    480     return_ACPI_STATUS (Status);
    481 }
    482 
    483 ACPI_EXPORT_SYMBOL (AcpiUnloadParentTable)
    484