Home | History | Annotate | Line # | Download | only in tables
tbinstal.c revision 1.1.1.3.12.2
      1           1.1    jruoho /******************************************************************************
      2           1.1    jruoho  *
      3           1.1    jruoho  * Module Name: tbinstal - ACPI table installation and removal
      4           1.1    jruoho  *
      5           1.1    jruoho  *****************************************************************************/
      6           1.1    jruoho 
      7       1.1.1.2    jruoho /*
      8  1.1.1.3.12.2  jdolecek  * Copyright (C) 2000 - 2017, Intel Corp.
      9           1.1    jruoho  * All rights reserved.
     10           1.1    jruoho  *
     11       1.1.1.2    jruoho  * Redistribution and use in source and binary forms, with or without
     12       1.1.1.2    jruoho  * modification, are permitted provided that the following conditions
     13       1.1.1.2    jruoho  * are met:
     14       1.1.1.2    jruoho  * 1. Redistributions of source code must retain the above copyright
     15       1.1.1.2    jruoho  *    notice, this list of conditions, and the following disclaimer,
     16       1.1.1.2    jruoho  *    without modification.
     17       1.1.1.2    jruoho  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
     18       1.1.1.2    jruoho  *    substantially similar to the "NO WARRANTY" disclaimer below
     19       1.1.1.2    jruoho  *    ("Disclaimer") and any redistribution must be conditioned upon
     20       1.1.1.2    jruoho  *    including a substantially similar Disclaimer requirement for further
     21       1.1.1.2    jruoho  *    binary redistribution.
     22       1.1.1.2    jruoho  * 3. Neither the names of the above-listed copyright holders nor the names
     23       1.1.1.2    jruoho  *    of any contributors may be used to endorse or promote products derived
     24       1.1.1.2    jruoho  *    from this software without specific prior written permission.
     25       1.1.1.2    jruoho  *
     26       1.1.1.2    jruoho  * Alternatively, this software may be distributed under the terms of the
     27       1.1.1.2    jruoho  * GNU General Public License ("GPL") version 2 as published by the Free
     28       1.1.1.2    jruoho  * Software Foundation.
     29       1.1.1.2    jruoho  *
     30       1.1.1.2    jruoho  * NO WARRANTY
     31       1.1.1.2    jruoho  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     32       1.1.1.2    jruoho  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     33       1.1.1.2    jruoho  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR
     34       1.1.1.2    jruoho  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     35       1.1.1.2    jruoho  * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     36       1.1.1.2    jruoho  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     37       1.1.1.2    jruoho  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     38       1.1.1.2    jruoho  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     39       1.1.1.2    jruoho  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
     40       1.1.1.2    jruoho  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     41       1.1.1.2    jruoho  * POSSIBILITY OF SUCH DAMAGES.
     42       1.1.1.2    jruoho  */
     43           1.1    jruoho 
     44           1.1    jruoho #include "acpi.h"
     45           1.1    jruoho #include "accommon.h"
     46           1.1    jruoho #include "actables.h"
     47           1.1    jruoho 
     48           1.1    jruoho #define _COMPONENT          ACPI_TABLES
     49           1.1    jruoho         ACPI_MODULE_NAME    ("tbinstal")
     50           1.1    jruoho 
     51           1.1    jruoho 
     52           1.1    jruoho /*******************************************************************************
     53           1.1    jruoho  *
     54  1.1.1.3.12.2  jdolecek  * FUNCTION:    AcpiTbInstallTableWithOverride
     55           1.1    jruoho  *
     56  1.1.1.3.12.2  jdolecek  * PARAMETERS:  NewTableDesc            - New table descriptor to install
     57  1.1.1.3.12.2  jdolecek  *              Override                - Whether override should be performed
     58  1.1.1.3.12.2  jdolecek  *              TableIndex              - Where the table index is returned
     59           1.1    jruoho  *
     60  1.1.1.3.12.2  jdolecek  * RETURN:      None
     61           1.1    jruoho  *
     62  1.1.1.3.12.2  jdolecek  * DESCRIPTION: Install an ACPI table into the global data structure. The
     63  1.1.1.3.12.2  jdolecek  *              table override mechanism is called to allow the host
     64  1.1.1.3.12.2  jdolecek  *              OS to replace any table before it is installed in the root
     65  1.1.1.3.12.2  jdolecek  *              table array.
     66           1.1    jruoho  *
     67           1.1    jruoho  ******************************************************************************/
     68           1.1    jruoho 
     69  1.1.1.3.12.2  jdolecek void
     70  1.1.1.3.12.2  jdolecek AcpiTbInstallTableWithOverride (
     71  1.1.1.3.12.2  jdolecek     ACPI_TABLE_DESC         *NewTableDesc,
     72  1.1.1.3.12.2  jdolecek     BOOLEAN                 Override,
     73           1.1    jruoho     UINT32                  *TableIndex)
     74           1.1    jruoho {
     75           1.1    jruoho     UINT32                  i;
     76  1.1.1.3.12.2  jdolecek     ACPI_STATUS             Status;
     77           1.1    jruoho 
     78           1.1    jruoho 
     79  1.1.1.3.12.2  jdolecek     Status = AcpiTbGetNextTableDescriptor (&i, NULL);
     80  1.1.1.3.12.2  jdolecek     if (ACPI_FAILURE (Status))
     81           1.1    jruoho     {
     82  1.1.1.3.12.2  jdolecek         return;
     83           1.1    jruoho     }
     84           1.1    jruoho 
     85           1.1    jruoho     /*
     86           1.1    jruoho      * ACPI Table Override:
     87  1.1.1.3.12.2  jdolecek      *
     88  1.1.1.3.12.2  jdolecek      * Before we install the table, let the host OS override it with a new
     89  1.1.1.3.12.2  jdolecek      * one if desired. Any table within the RSDT/XSDT can be replaced,
     90  1.1.1.3.12.2  jdolecek      * including the DSDT which is pointed to by the FADT.
     91           1.1    jruoho      */
     92  1.1.1.3.12.2  jdolecek     if (Override)
     93           1.1    jruoho     {
     94  1.1.1.3.12.2  jdolecek         AcpiTbOverrideTable (NewTableDesc);
     95           1.1    jruoho     }
     96           1.1    jruoho 
     97  1.1.1.3.12.2  jdolecek     AcpiTbInitTableDescriptor (&AcpiGbl_RootTableList.Tables[i],
     98  1.1.1.3.12.2  jdolecek         NewTableDesc->Address, NewTableDesc->Flags, NewTableDesc->Pointer);
     99           1.1    jruoho 
    100  1.1.1.3.12.2  jdolecek     AcpiTbPrintTableHeader (NewTableDesc->Address, NewTableDesc->Pointer);
    101  1.1.1.3.12.1       tls 
    102  1.1.1.3.12.2  jdolecek     /* This synchronizes AcpiGbl_DsdtIndex */
    103  1.1.1.3.12.1       tls 
    104  1.1.1.3.12.2  jdolecek     *TableIndex = i;
    105  1.1.1.3.12.1       tls 
    106  1.1.1.3.12.2  jdolecek     /* Set the global integer width (based upon revision of the DSDT) */
    107  1.1.1.3.12.1       tls 
    108  1.1.1.3.12.2  jdolecek     if (i == AcpiGbl_DsdtIndex)
    109  1.1.1.3.12.1       tls     {
    110  1.1.1.3.12.2  jdolecek         AcpiUtSetIntegerWidth (NewTableDesc->Pointer->Revision);
    111  1.1.1.3.12.1       tls     }
    112  1.1.1.3.12.1       tls }
    113  1.1.1.3.12.1       tls 
    114  1.1.1.3.12.1       tls 
    115  1.1.1.3.12.1       tls /*******************************************************************************
    116  1.1.1.3.12.1       tls  *
    117  1.1.1.3.12.2  jdolecek  * FUNCTION:    AcpiTbInstallStandardTable
    118           1.1    jruoho  *
    119  1.1.1.3.12.2  jdolecek  * PARAMETERS:  Address             - Address of the table (might be a virtual
    120  1.1.1.3.12.2  jdolecek  *                                    address depending on the TableFlags)
    121  1.1.1.3.12.2  jdolecek  *              Flags               - Flags for the table
    122  1.1.1.3.12.2  jdolecek  *              Reload              - Whether reload should be performed
    123  1.1.1.3.12.2  jdolecek  *              Override            - Whether override should be performed
    124  1.1.1.3.12.2  jdolecek  *              TableIndex          - Where the table index is returned
    125           1.1    jruoho  *
    126           1.1    jruoho  * RETURN:      Status
    127           1.1    jruoho  *
    128  1.1.1.3.12.2  jdolecek  * DESCRIPTION: This function is called to verify and install an ACPI table.
    129  1.1.1.3.12.2  jdolecek  *              When this function is called by "Load" or "LoadTable" opcodes,
    130  1.1.1.3.12.2  jdolecek  *              or by AcpiLoadTable() API, the "Reload" parameter is set.
    131  1.1.1.3.12.2  jdolecek  *              After sucessfully returning from this function, table is
    132  1.1.1.3.12.2  jdolecek  *              "INSTALLED" but not "VALIDATED".
    133           1.1    jruoho  *
    134           1.1    jruoho  ******************************************************************************/
    135           1.1    jruoho 
    136           1.1    jruoho ACPI_STATUS
    137  1.1.1.3.12.2  jdolecek AcpiTbInstallStandardTable (
    138  1.1.1.3.12.2  jdolecek     ACPI_PHYSICAL_ADDRESS   Address,
    139  1.1.1.3.12.2  jdolecek     UINT8                   Flags,
    140  1.1.1.3.12.2  jdolecek     BOOLEAN                 Reload,
    141  1.1.1.3.12.2  jdolecek     BOOLEAN                 Override,
    142  1.1.1.3.12.2  jdolecek     UINT32                  *TableIndex)
    143           1.1    jruoho {
    144  1.1.1.3.12.2  jdolecek     UINT32                  i;
    145  1.1.1.3.12.2  jdolecek     ACPI_STATUS             Status = AE_OK;
    146  1.1.1.3.12.2  jdolecek     ACPI_TABLE_DESC         NewTableDesc;
    147           1.1    jruoho 
    148           1.1    jruoho 
    149  1.1.1.3.12.2  jdolecek     ACPI_FUNCTION_TRACE (TbInstallStandardTable);
    150           1.1    jruoho 
    151           1.1    jruoho 
    152  1.1.1.3.12.2  jdolecek     /* Acquire a temporary table descriptor for validation */
    153           1.1    jruoho 
    154  1.1.1.3.12.2  jdolecek     Status = AcpiTbAcquireTempTable (&NewTableDesc, Address, Flags);
    155  1.1.1.3.12.2  jdolecek     if (ACPI_FAILURE (Status))
    156  1.1.1.3.12.1       tls     {
    157  1.1.1.3.12.2  jdolecek         ACPI_ERROR ((AE_INFO,
    158  1.1.1.3.12.2  jdolecek             "Could not acquire table length at %8.8X%8.8X",
    159  1.1.1.3.12.2  jdolecek             ACPI_FORMAT_UINT64 (Address)));
    160  1.1.1.3.12.2  jdolecek         return_ACPI_STATUS (Status);
    161  1.1.1.3.12.1       tls     }
    162  1.1.1.3.12.1       tls 
    163  1.1.1.3.12.2  jdolecek     /*
    164  1.1.1.3.12.2  jdolecek      * Optionally do not load any SSDTs from the RSDT/XSDT. This can
    165  1.1.1.3.12.2  jdolecek      * be useful for debugging ACPI problems on some machines.
    166  1.1.1.3.12.2  jdolecek      */
    167  1.1.1.3.12.2  jdolecek     if (!Reload &&
    168  1.1.1.3.12.2  jdolecek         AcpiGbl_DisableSsdtTableInstall &&
    169  1.1.1.3.12.2  jdolecek         ACPI_COMPARE_NAME (&NewTableDesc.Signature, ACPI_SIG_SSDT))
    170           1.1    jruoho     {
    171  1.1.1.3.12.2  jdolecek         ACPI_INFO ((
    172  1.1.1.3.12.2  jdolecek             "Ignoring installation of %4.4s at %8.8X%8.8X",
    173  1.1.1.3.12.2  jdolecek             NewTableDesc.Signature.Ascii, ACPI_FORMAT_UINT64 (Address)));
    174  1.1.1.3.12.2  jdolecek         goto ReleaseAndExit;
    175           1.1    jruoho     }
    176           1.1    jruoho 
    177  1.1.1.3.12.2  jdolecek     /* Acquire the table lock */
    178           1.1    jruoho 
    179  1.1.1.3.12.2  jdolecek     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
    180           1.1    jruoho 
    181  1.1.1.3.12.2  jdolecek     /* Validate and verify a table before installation */
    182           1.1    jruoho 
    183  1.1.1.3.12.2  jdolecek     Status = AcpiTbVerifyTempTable (&NewTableDesc, NULL, &i);
    184  1.1.1.3.12.2  jdolecek     if (ACPI_FAILURE (Status))
    185           1.1    jruoho     {
    186  1.1.1.3.12.2  jdolecek         if (Status == AE_CTRL_TERMINATE)
    187           1.1    jruoho         {
    188  1.1.1.3.12.2  jdolecek             /*
    189  1.1.1.3.12.2  jdolecek              * Table was unloaded, allow it to be reloaded.
    190  1.1.1.3.12.2  jdolecek              * As we are going to return AE_OK to the caller, we should
    191  1.1.1.3.12.2  jdolecek              * take the responsibility of freeing the input descriptor.
    192  1.1.1.3.12.2  jdolecek              * Refill the input descriptor to ensure
    193  1.1.1.3.12.2  jdolecek              * AcpiTbInstallTableWithOverride() can be called again to
    194  1.1.1.3.12.2  jdolecek              * indicate the re-installation.
    195  1.1.1.3.12.2  jdolecek              */
    196  1.1.1.3.12.2  jdolecek             AcpiTbUninstallTable (&NewTableDesc);
    197  1.1.1.3.12.2  jdolecek             (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
    198  1.1.1.3.12.2  jdolecek             *TableIndex = i;
    199  1.1.1.3.12.2  jdolecek             return_ACPI_STATUS (AE_OK);
    200           1.1    jruoho         }
    201  1.1.1.3.12.2  jdolecek         goto UnlockAndExit;
    202           1.1    jruoho     }
    203           1.1    jruoho 
    204  1.1.1.3.12.2  jdolecek     /* Add the table to the global root table list */
    205           1.1    jruoho 
    206  1.1.1.3.12.2  jdolecek     AcpiTbInstallTableWithOverride (&NewTableDesc, Override, TableIndex);
    207           1.1    jruoho 
    208  1.1.1.3.12.2  jdolecek     /* Invoke table handler */
    209  1.1.1.3.12.1       tls 
    210  1.1.1.3.12.2  jdolecek     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
    211  1.1.1.3.12.2  jdolecek     AcpiTbNotifyTable (ACPI_TABLE_EVENT_INSTALL, NewTableDesc.Pointer);
    212  1.1.1.3.12.2  jdolecek     (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
    213           1.1    jruoho 
    214  1.1.1.3.12.2  jdolecek UnlockAndExit:
    215  1.1.1.3.12.1       tls 
    216  1.1.1.3.12.2  jdolecek     /* Release the table lock */
    217           1.1    jruoho 
    218  1.1.1.3.12.2  jdolecek     (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
    219  1.1.1.3.12.1       tls 
    220  1.1.1.3.12.2  jdolecek ReleaseAndExit:
    221  1.1.1.3.12.1       tls 
    222  1.1.1.3.12.2  jdolecek     /* Release the temporary table descriptor */
    223           1.1    jruoho 
    224  1.1.1.3.12.2  jdolecek     AcpiTbReleaseTempTable (&NewTableDesc);
    225  1.1.1.3.12.2  jdolecek     return_ACPI_STATUS (Status);
    226           1.1    jruoho }
    227           1.1    jruoho 
    228           1.1    jruoho 
    229           1.1    jruoho /*******************************************************************************
    230           1.1    jruoho  *
    231  1.1.1.3.12.2  jdolecek  * FUNCTION:    AcpiTbOverrideTable
    232           1.1    jruoho  *
    233  1.1.1.3.12.2  jdolecek  * PARAMETERS:  OldTableDesc        - Validated table descriptor to be
    234  1.1.1.3.12.2  jdolecek  *                                    overridden
    235           1.1    jruoho  *
    236           1.1    jruoho  * RETURN:      None
    237           1.1    jruoho  *
    238  1.1.1.3.12.2  jdolecek  * DESCRIPTION: Attempt table override by calling the OSL override functions.
    239  1.1.1.3.12.2  jdolecek  *              Note: If the table is overridden, then the entire new table
    240  1.1.1.3.12.2  jdolecek  *              is acquired and returned by this function.
    241  1.1.1.3.12.2  jdolecek  *              Before/after invocation, the table descriptor is in a state
    242  1.1.1.3.12.2  jdolecek  *              that is "VALIDATED".
    243           1.1    jruoho  *
    244           1.1    jruoho  ******************************************************************************/
    245           1.1    jruoho 
    246           1.1    jruoho void
    247  1.1.1.3.12.2  jdolecek AcpiTbOverrideTable (
    248  1.1.1.3.12.2  jdolecek     ACPI_TABLE_DESC         *OldTableDesc)
    249           1.1    jruoho {
    250           1.1    jruoho     ACPI_STATUS             Status;
    251  1.1.1.3.12.2  jdolecek     const char              *OverrideType;
    252  1.1.1.3.12.2  jdolecek     ACPI_TABLE_DESC         NewTableDesc;
    253  1.1.1.3.12.2  jdolecek     ACPI_TABLE_HEADER       *Table;
    254  1.1.1.3.12.2  jdolecek     ACPI_PHYSICAL_ADDRESS   Address;
    255  1.1.1.3.12.2  jdolecek     UINT32                  Length;
    256           1.1    jruoho 
    257           1.1    jruoho 
    258  1.1.1.3.12.2  jdolecek     /* (1) Attempt logical override (returns a logical address) */
    259           1.1    jruoho 
    260  1.1.1.3.12.2  jdolecek     Status = AcpiOsTableOverride (OldTableDesc->Pointer, &Table);
    261  1.1.1.3.12.2  jdolecek     if (ACPI_SUCCESS (Status) && Table)
    262           1.1    jruoho     {
    263  1.1.1.3.12.2  jdolecek         AcpiTbAcquireTempTable (&NewTableDesc, ACPI_PTR_TO_PHYSADDR (Table),
    264  1.1.1.3.12.2  jdolecek             ACPI_TABLE_ORIGIN_EXTERNAL_VIRTUAL);
    265  1.1.1.3.12.2  jdolecek         OverrideType = "Logical";
    266  1.1.1.3.12.2  jdolecek         goto FinishOverride;
    267           1.1    jruoho     }
    268           1.1    jruoho 
    269  1.1.1.3.12.2  jdolecek     /* (2) Attempt physical override (returns a physical address) */
    270           1.1    jruoho 
    271  1.1.1.3.12.2  jdolecek     Status = AcpiOsPhysicalTableOverride (OldTableDesc->Pointer,
    272  1.1.1.3.12.2  jdolecek         &Address, &Length);
    273  1.1.1.3.12.2  jdolecek     if (ACPI_SUCCESS (Status) && Address && Length)
    274  1.1.1.3.12.2  jdolecek     {
    275  1.1.1.3.12.2  jdolecek         AcpiTbAcquireTempTable (&NewTableDesc, Address,
    276  1.1.1.3.12.2  jdolecek             ACPI_TABLE_ORIGIN_INTERNAL_PHYSICAL);
    277  1.1.1.3.12.2  jdolecek         OverrideType = "Physical";
    278  1.1.1.3.12.2  jdolecek         goto FinishOverride;
    279           1.1    jruoho     }
    280           1.1    jruoho 
    281  1.1.1.3.12.2  jdolecek     return; /* There was no override */
    282           1.1    jruoho 
    283  1.1.1.3.12.2  jdolecek 
    284  1.1.1.3.12.2  jdolecek FinishOverride:
    285           1.1    jruoho 
    286           1.1    jruoho     /*
    287  1.1.1.3.12.2  jdolecek      * Validate and verify a table before overriding, no nested table
    288  1.1.1.3.12.2  jdolecek      * duplication check as it's too complicated and unnecessary.
    289           1.1    jruoho      */
    290  1.1.1.3.12.2  jdolecek     Status = AcpiTbVerifyTempTable (&NewTableDesc, NULL, NULL);
    291           1.1    jruoho     if (ACPI_FAILURE (Status))
    292           1.1    jruoho     {
    293  1.1.1.3.12.2  jdolecek         return;
    294           1.1    jruoho     }
    295           1.1    jruoho 
    296  1.1.1.3.12.2  jdolecek     ACPI_INFO (("%4.4s 0x%8.8X%8.8X"
    297  1.1.1.3.12.2  jdolecek         " %s table override, new table: 0x%8.8X%8.8X",
    298  1.1.1.3.12.2  jdolecek         OldTableDesc->Signature.Ascii,
    299  1.1.1.3.12.2  jdolecek         ACPI_FORMAT_UINT64 (OldTableDesc->Address),
    300  1.1.1.3.12.2  jdolecek         OverrideType, ACPI_FORMAT_UINT64 (NewTableDesc.Address)));
    301           1.1    jruoho 
    302  1.1.1.3.12.2  jdolecek     /* We can now uninstall the original table */
    303           1.1    jruoho 
    304  1.1.1.3.12.2  jdolecek     AcpiTbUninstallTable (OldTableDesc);
    305           1.1    jruoho 
    306  1.1.1.3.12.2  jdolecek     /*
    307  1.1.1.3.12.2  jdolecek      * Replace the original table descriptor and keep its state as
    308  1.1.1.3.12.2  jdolecek      * "VALIDATED".
    309  1.1.1.3.12.2  jdolecek      */
    310  1.1.1.3.12.2  jdolecek     AcpiTbInitTableDescriptor (OldTableDesc, NewTableDesc.Address,
    311  1.1.1.3.12.2  jdolecek         NewTableDesc.Flags, NewTableDesc.Pointer);
    312  1.1.1.3.12.2  jdolecek     AcpiTbValidateTempTable (OldTableDesc);
    313           1.1    jruoho 
    314  1.1.1.3.12.2  jdolecek     /* Release the temporary table descriptor */
    315           1.1    jruoho 
    316  1.1.1.3.12.2  jdolecek     AcpiTbReleaseTempTable (&NewTableDesc);
    317           1.1    jruoho }
    318           1.1    jruoho 
    319           1.1    jruoho 
    320           1.1    jruoho /*******************************************************************************
    321           1.1    jruoho  *
    322  1.1.1.3.12.2  jdolecek  * FUNCTION:    AcpiTbUninstallTable
    323           1.1    jruoho  *
    324  1.1.1.3.12.2  jdolecek  * PARAMETERS:  TableDesc           - Table descriptor
    325           1.1    jruoho  *
    326  1.1.1.3.12.2  jdolecek  * RETURN:      None
    327           1.1    jruoho  *
    328  1.1.1.3.12.2  jdolecek  * DESCRIPTION: Delete one internal ACPI table
    329           1.1    jruoho  *
    330           1.1    jruoho  ******************************************************************************/
    331           1.1    jruoho 
    332  1.1.1.3.12.2  jdolecek void
    333  1.1.1.3.12.2  jdolecek AcpiTbUninstallTable (
    334  1.1.1.3.12.2  jdolecek     ACPI_TABLE_DESC         *TableDesc)
    335           1.1    jruoho {
    336           1.1    jruoho 
    337  1.1.1.3.12.2  jdolecek     ACPI_FUNCTION_TRACE (TbUninstallTable);
    338           1.1    jruoho 
    339           1.1    jruoho 
    340  1.1.1.3.12.2  jdolecek     /* Table must be installed */
    341           1.1    jruoho 
    342  1.1.1.3.12.2  jdolecek     if (!TableDesc->Address)
    343           1.1    jruoho     {
    344  1.1.1.3.12.2  jdolecek         return_VOID;
    345           1.1    jruoho     }
    346           1.1    jruoho 
    347  1.1.1.3.12.2  jdolecek     AcpiTbInvalidateTable (TableDesc);
    348           1.1    jruoho 
    349  1.1.1.3.12.2  jdolecek     if ((TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) ==
    350  1.1.1.3.12.2  jdolecek         ACPI_TABLE_ORIGIN_INTERNAL_VIRTUAL)
    351           1.1    jruoho     {
    352  1.1.1.3.12.2  jdolecek 	void *ptr = ACPI_PHYSADDR_TO_PTR (TableDesc->Address);
    353  1.1.1.3.12.2  jdolecek 	if (ptr)
    354  1.1.1.3.12.2  jdolecek 	{
    355  1.1.1.3.12.2  jdolecek 		ACPI_FREE (ptr);
    356  1.1.1.3.12.2  jdolecek 	}
    357           1.1    jruoho     }
    358           1.1    jruoho 
    359  1.1.1.3.12.2  jdolecek     TableDesc->Address = ACPI_PTR_TO_PHYSADDR (NULL);
    360  1.1.1.3.12.2  jdolecek     return_VOID;
    361           1.1    jruoho }
    362