diff options
author | Jung-uk Kim <jkim@FreeBSD.org> | 2016-08-01 21:20:41 +0000 |
---|---|---|
committer | Jung-uk Kim <jkim@FreeBSD.org> | 2016-08-01 21:20:41 +0000 |
commit | 8bc6ab62dbdb3e8b0d2253e0440f6f58ac9afd3d (patch) | |
tree | b2316b6fda5368bb277671853a71b2a758582b05 /source/os_specific | |
parent | 4d46bb7749ef0cf25eb2b25f2d7324023cb754b4 (diff) | |
download | src-test2-8bc6ab62dbdb3e8b0d2253e0440f6f58ac9afd3d.tar.gz src-test2-8bc6ab62dbdb3e8b0d2253e0440f6f58ac9afd3d.zip |
Notes
Diffstat (limited to 'source/os_specific')
-rw-r--r-- | source/os_specific/service_layers/osefitbl.c | 1033 | ||||
-rw-r--r-- | source/os_specific/service_layers/osefixf.c | 1091 | ||||
-rw-r--r-- | source/os_specific/service_layers/oslibcfs.c | 258 | ||||
-rw-r--r-- | source/os_specific/service_layers/osunixxf.c | 3 | ||||
-rw-r--r-- | source/os_specific/service_layers/oswintbl.c | 68 | ||||
-rw-r--r-- | source/os_specific/service_layers/oswinxf.c | 3 |
6 files changed, 56 insertions, 2400 deletions
diff --git a/source/os_specific/service_layers/osefitbl.c b/source/os_specific/service_layers/osefitbl.c deleted file mode 100644 index ef95e164bea1..000000000000 --- a/source/os_specific/service_layers/osefitbl.c +++ /dev/null @@ -1,1033 +0,0 @@ -/****************************************************************************** - * - * Module Name: osefitbl - EFI OSL for obtaining ACPI tables - * - *****************************************************************************/ - -/* - * Copyright (C) 2000 - 2016, Intel Corp. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions, and the following disclaimer, - * without modification. - * 2. Redistributions in binary form must reproduce at minimum a disclaimer - * substantially similar to the "NO WARRANTY" disclaimer below - * ("Disclaimer") and any redistribution must be conditioned upon - * including a substantially similar Disclaimer requirement for further - * binary redistribution. - * 3. Neither the names of the above-listed copyright holders nor the names - * of any contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * Alternatively, this software may be distributed under the terms of the - * GNU General Public License ("GPL") version 2 as published by the Free - * Software Foundation. - * - * NO WARRANTY - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - */ - -#include "acpidump.h" - - -#define _COMPONENT ACPI_OS_SERVICES - ACPI_MODULE_NAME ("osefitbl") - - -#ifndef PATH_MAX -#define PATH_MAX 256 -#endif - - -/* List of information about obtained ACPI tables */ - -typedef struct osl_table_info -{ - struct osl_table_info *Next; - UINT32 Instance; - char Signature[ACPI_NAME_SIZE]; - -} OSL_TABLE_INFO; - -/* Local prototypes */ - -static ACPI_STATUS -OslTableInitialize ( - void); - -static ACPI_STATUS -OslAddTableToList ( - char *Signature, - UINT32 Instance); - -static ACPI_STATUS -OslMapTable ( - ACPI_SIZE Address, - char *Signature, - ACPI_TABLE_HEADER **Table); - -static void -OslUnmapTable ( - ACPI_TABLE_HEADER *Table); - -static ACPI_STATUS -OslLoadRsdp ( - void); - -static ACPI_STATUS -OslListTables ( - void); - -static ACPI_STATUS -OslGetTable ( - char *Signature, - UINT32 Instance, - ACPI_TABLE_HEADER **Table, - ACPI_PHYSICAL_ADDRESS *Address); - - -/* File locations */ - -#define EFI_SYSTAB "/sys/firmware/efi/systab" - -/* Initialization flags */ - -UINT8 Gbl_TableListInitialized = FALSE; - -/* Local copies of main ACPI tables */ - -ACPI_TABLE_RSDP Gbl_Rsdp; -ACPI_TABLE_FADT *Gbl_Fadt = NULL; -ACPI_TABLE_RSDT *Gbl_Rsdt = NULL; -ACPI_TABLE_XSDT *Gbl_Xsdt = NULL; - -/* Table addresses */ - -ACPI_PHYSICAL_ADDRESS Gbl_FadtAddress = 0; -ACPI_PHYSICAL_ADDRESS Gbl_RsdpAddress = 0; - -/* Revision of RSD PTR */ - -UINT8 Gbl_Revision = 0; - -OSL_TABLE_INFO *Gbl_TableListHead = NULL; -UINT32 Gbl_TableCount = 0; - - -/****************************************************************************** - * - * FUNCTION: AcpiOsGetTableByAddress - * - * PARAMETERS: Address - Physical address of the ACPI table - * Table - Where a pointer to the table is returned - * - * RETURN: Status; Table buffer is returned if AE_OK. - * AE_NOT_FOUND: A valid table was not found at the address - * - * DESCRIPTION: Get an ACPI table via a physical memory address. - * - *****************************************************************************/ - -ACPI_STATUS -AcpiOsGetTableByAddress ( - ACPI_PHYSICAL_ADDRESS Address, - ACPI_TABLE_HEADER **Table) -{ - UINT32 TableLength; - ACPI_TABLE_HEADER *MappedTable; - ACPI_TABLE_HEADER *LocalTable = NULL; - ACPI_STATUS Status = AE_OK; - - - /* Get main ACPI tables from memory on first invocation of this function */ - - Status = OslTableInitialize (); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - - /* Map the table and validate it */ - - Status = OslMapTable (Address, NULL, &MappedTable); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - - /* Copy table to local buffer and return it */ - - TableLength = ApGetTableLength (MappedTable); - if (TableLength == 0) - { - Status = AE_BAD_HEADER; - goto Exit; - } - - LocalTable = ACPI_ALLOCATE_ZEROED (TableLength); - if (!LocalTable) - { - Status = AE_NO_MEMORY; - goto Exit; - } - - memcpy (LocalTable, MappedTable, TableLength); - -Exit: - OslUnmapTable (MappedTable); - *Table = LocalTable; - return (Status); -} - - -/****************************************************************************** - * - * FUNCTION: AcpiOsGetTableByName - * - * PARAMETERS: Signature - ACPI Signature for desired table. Must be - * a null terminated 4-character string. - * Instance - Multiple table support for SSDT/UEFI (0...n) - * Must be 0 for other tables. - * Table - Where a pointer to the table is returned - * Address - Where the table physical address is returned - * - * RETURN: Status; Table buffer and physical address returned if AE_OK. - * AE_LIMIT: Instance is beyond valid limit - * AE_NOT_FOUND: A table with the signature was not found - * - * NOTE: Assumes the input signature is uppercase. - * - *****************************************************************************/ - -ACPI_STATUS -AcpiOsGetTableByName ( - char *Signature, - UINT32 Instance, - ACPI_TABLE_HEADER **Table, - ACPI_PHYSICAL_ADDRESS *Address) -{ - ACPI_STATUS Status; - - - /* Get main ACPI tables from memory on first invocation of this function */ - - Status = OslTableInitialize (); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - - /* Not a main ACPI table, attempt to extract it from the RSDT/XSDT */ - - if (!Gbl_DumpCustomizedTables) - { - /* Attempt to get the table from the memory */ - - Status = OslGetTable (Signature, Instance, Table, Address); - } - else - { - /* Attempt to get the table from the static directory */ - - Status = AE_SUPPORT; - } - - return (Status); -} - - -/****************************************************************************** - * - * FUNCTION: OslAddTableToList - * - * PARAMETERS: Signature - Table signature - * Instance - Table instance - * - * RETURN: Status; Successfully added if AE_OK. - * AE_NO_MEMORY: Memory allocation error - * - * DESCRIPTION: Insert a table structure into OSL table list. - * - *****************************************************************************/ - -static ACPI_STATUS -OslAddTableToList ( - char *Signature, - UINT32 Instance) -{ - OSL_TABLE_INFO *NewInfo; - OSL_TABLE_INFO *Next; - UINT32 NextInstance = 0; - BOOLEAN Found = FALSE; - - - NewInfo = ACPI_ALLOCATE_ZEROED (sizeof (OSL_TABLE_INFO)); - if (!NewInfo) - { - return (AE_NO_MEMORY); - } - - ACPI_MOVE_NAME (NewInfo->Signature, Signature); - - if (!Gbl_TableListHead) - { - Gbl_TableListHead = NewInfo; - } - else - { - Next = Gbl_TableListHead; - while (1) - { - if (ACPI_COMPARE_NAME (Next->Signature, Signature)) - { - if (Next->Instance == Instance) - { - Found = TRUE; - } - if (Next->Instance >= NextInstance) - { - NextInstance = Next->Instance + 1; - } - } - - if (!Next->Next) - { - break; - } - Next = Next->Next; - } - Next->Next = NewInfo; - } - - if (Found) - { - if (Instance) - { - AcpiLogError ( - "%4.4s: Warning unmatched table instance %d, expected %d\n", - Signature, Instance, NextInstance); - } - Instance = NextInstance; - } - - NewInfo->Instance = Instance; - Gbl_TableCount++; - - return (AE_OK); -} - - -/****************************************************************************** - * - * FUNCTION: AcpiOsGetTableByIndex - * - * PARAMETERS: Index - Which table to get - * Table - Where a pointer to the table is returned - * Instance - Where a pointer to the table instance no. is - * returned - * Address - Where the table physical address is returned - * - * RETURN: Status; Table buffer and physical address returned if AE_OK. - * AE_LIMIT: Index is beyond valid limit - * - * DESCRIPTION: Get an ACPI table via an index value (0 through n). Returns - * AE_LIMIT when an invalid index is reached. Index is not - * necessarily an index into the RSDT/XSDT. - * - *****************************************************************************/ - -ACPI_STATUS -AcpiOsGetTableByIndex ( - UINT32 Index, - ACPI_TABLE_HEADER **Table, - UINT32 *Instance, - ACPI_PHYSICAL_ADDRESS *Address) -{ - OSL_TABLE_INFO *Info; - ACPI_STATUS Status; - UINT32 i; - - - /* Get main ACPI tables from memory on first invocation of this function */ - - Status = OslTableInitialize (); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - - /* Validate Index */ - - if (Index >= Gbl_TableCount) - { - return (AE_LIMIT); - } - - /* Point to the table list entry specified by the Index argument */ - - Info = Gbl_TableListHead; - for (i = 0; i < Index; i++) - { - Info = Info->Next; - } - - /* Now we can just get the table via the signature */ - - Status = AcpiOsGetTableByName (Info->Signature, Info->Instance, - Table, Address); - - if (ACPI_SUCCESS (Status)) - { - *Instance = Info->Instance; - } - return (Status); -} - - -/****************************************************************************** - * - * FUNCTION: OslLoadRsdp - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Scan and load RSDP. - * - *****************************************************************************/ - -static ACPI_STATUS -OslLoadRsdp ( - void) -{ - ACPI_TABLE_HEADER *MappedTable; - UINT8 *RsdpAddress; - ACPI_PHYSICAL_ADDRESS RsdpBase; - ACPI_SIZE RsdpSize; - - - /* Get RSDP from memory */ - - RsdpSize = sizeof (ACPI_TABLE_RSDP); - if (Gbl_RsdpBase) - { - RsdpBase = Gbl_RsdpBase; - } - else - { - RsdpBase = AcpiOsGetRootPointer (); - } - - if (!RsdpBase) - { - RsdpBase = ACPI_HI_RSDP_WINDOW_BASE; - RsdpSize = ACPI_HI_RSDP_WINDOW_SIZE; - } - - RsdpAddress = AcpiOsMapMemory (RsdpBase, RsdpSize); - if (!RsdpAddress) - { - return (AE_BAD_ADDRESS); - } - - /* Search low memory for the RSDP */ - - MappedTable = ACPI_CAST_PTR (ACPI_TABLE_HEADER, - AcpiTbScanMemoryForRsdp (RsdpAddress, RsdpSize)); - if (!MappedTable) - { - AcpiOsUnmapMemory (RsdpAddress, RsdpSize); - return (AE_NOT_FOUND); - } - - Gbl_RsdpAddress = RsdpBase + (ACPI_CAST8 (MappedTable) - RsdpAddress); - - memcpy (&Gbl_Rsdp, MappedTable, sizeof (ACPI_TABLE_RSDP)); - AcpiOsUnmapMemory (RsdpAddress, RsdpSize); - - return (AE_OK); -} - - -/****************************************************************************** - * - * FUNCTION: OslCanUseXsdt - * - * PARAMETERS: None - * - * RETURN: TRUE if XSDT is allowed to be used. - * - * DESCRIPTION: This function collects logic that can be used to determine if - * XSDT should be used instead of RSDT. - * - *****************************************************************************/ - -static BOOLEAN -OslCanUseXsdt ( - void) -{ - if (Gbl_Revision && !AcpiGbl_DoNotUseXsdt) - { - return (TRUE); - } - else - { - return (FALSE); - } -} - - -/****************************************************************************** - * - * FUNCTION: OslTableInitialize - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Initialize ACPI table data. Get and store main ACPI tables to - * local variables. Main ACPI tables include RSDT, FADT, RSDT, - * and/or XSDT. - * - *****************************************************************************/ - -static ACPI_STATUS -OslTableInitialize ( - void) -{ - ACPI_STATUS Status; - ACPI_PHYSICAL_ADDRESS Address; - - - if (Gbl_TableListInitialized) - { - return (AE_OK); - } - - /* Get RSDP from memory */ - - Status = OslLoadRsdp (); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - - /* Get XSDT from memory */ - - if (Gbl_Rsdp.Revision && !Gbl_DoNotDumpXsdt) - { - if (Gbl_Xsdt) - { - ACPI_FREE (Gbl_Xsdt); - Gbl_Xsdt = NULL; - } - - Gbl_Revision = 2; - Status = OslGetTable (ACPI_SIG_XSDT, 0, - ACPI_CAST_PTR (ACPI_TABLE_HEADER *, &Gbl_Xsdt), &Address); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - } - - /* Get RSDT from memory */ - - if (Gbl_Rsdp.RsdtPhysicalAddress) - { - if (Gbl_Rsdt) - { - ACPI_FREE (Gbl_Rsdt); - Gbl_Rsdt = NULL; - } - - Status = OslGetTable (ACPI_SIG_RSDT, 0, - ACPI_CAST_PTR (ACPI_TABLE_HEADER *, &Gbl_Rsdt), &Address); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - } - - /* Get FADT from memory */ - - if (Gbl_Fadt) - { - ACPI_FREE (Gbl_Fadt); - Gbl_Fadt = NULL; - } - - Status = OslGetTable (ACPI_SIG_FADT, 0, - ACPI_CAST_PTR (ACPI_TABLE_HEADER *, &Gbl_Fadt), &Gbl_FadtAddress); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - - if (!Gbl_DumpCustomizedTables) - { - /* Add mandatory tables to global table list first */ - - Status = OslAddTableToList (ACPI_RSDP_NAME, 0); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - - Status = OslAddTableToList (ACPI_SIG_RSDT, 0); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - - if (Gbl_Revision == 2) - { - Status = OslAddTableToList (ACPI_SIG_XSDT, 0); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - } - - Status = OslAddTableToList (ACPI_SIG_DSDT, 0); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - - Status = OslAddTableToList (ACPI_SIG_FACS, 0); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - - /* Add all tables found in the memory */ - - Status = OslListTables (); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - } - else - { - /* Add all tables found in the static directory */ - - Status = AE_SUPPORT; - } - - Gbl_TableListInitialized = TRUE; - return (AE_OK); -} - - -/****************************************************************************** - * - * FUNCTION: OslListTables - * - * PARAMETERS: None - * - * RETURN: Status; Table list is initialized if AE_OK. - * - * DESCRIPTION: Add ACPI tables to the table list from memory. - * - *****************************************************************************/ - -static ACPI_STATUS -OslListTables ( - void) -{ - ACPI_TABLE_HEADER *MappedTable = NULL; - UINT8 *TableData; - UINT8 NumberOfTables; - UINT8 ItemSize; - ACPI_PHYSICAL_ADDRESS TableAddress = 0; - ACPI_STATUS Status = AE_OK; - UINT32 i; - - - if (OslCanUseXsdt ()) - { - ItemSize = sizeof (UINT64); - TableData = ACPI_CAST8 (Gbl_Xsdt) + sizeof (ACPI_TABLE_HEADER); - NumberOfTables = - (UINT8) ((Gbl_Xsdt->Header.Length - sizeof (ACPI_TABLE_HEADER)) - / ItemSize); - } - else /* Use RSDT if XSDT is not available */ - { - ItemSize = sizeof (UINT32); - TableData = ACPI_CAST8 (Gbl_Rsdt) + sizeof (ACPI_TABLE_HEADER); - NumberOfTables = - (UINT8) ((Gbl_Rsdt->Header.Length - sizeof (ACPI_TABLE_HEADER)) - / ItemSize); - } - - /* Search RSDT/XSDT for the requested table */ - - for (i = 0; i < NumberOfTables; ++i, TableData += ItemSize) - { - if (OslCanUseXsdt ()) - { - TableAddress = - (ACPI_PHYSICAL_ADDRESS) (*ACPI_CAST64 (TableData)); - } - else - { - TableAddress = - (ACPI_PHYSICAL_ADDRESS) (*ACPI_CAST32 (TableData)); - } - - /* Skip NULL entries in RSDT/XSDT */ - - if (!TableAddress) - { - continue; - } - - Status = OslMapTable (TableAddress, NULL, &MappedTable); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - - OslAddTableToList (MappedTable->Signature, 0); - OslUnmapTable (MappedTable); - } - - return (AE_OK); -} - - -/****************************************************************************** - * - * FUNCTION: OslGetTable - * - * PARAMETERS: Signature - ACPI Signature for common table. Must be - * a null terminated 4-character string. - * Instance - Multiple table support for SSDT/UEFI (0...n) - * Must be 0 for other tables. - * Table - Where a pointer to the table is returned - * Address - Where the table physical address is returned - * - * RETURN: Status; Table buffer and physical address returned if AE_OK. - * AE_LIMIT: Instance is beyond valid limit - * AE_NOT_FOUND: A table with the signature was not found - * - * DESCRIPTION: Get a BIOS provided ACPI table - * - * NOTE: Assumes the input signature is uppercase. - * - *****************************************************************************/ - -static ACPI_STATUS -OslGetTable ( - char *Signature, - UINT32 Instance, - ACPI_TABLE_HEADER **Table, - ACPI_PHYSICAL_ADDRESS *Address) -{ - ACPI_TABLE_HEADER *LocalTable = NULL; - ACPI_TABLE_HEADER *MappedTable = NULL; - UINT8 *TableData; - UINT8 NumberOfTables; - UINT8 ItemSize; - UINT32 CurrentInstance = 0; - ACPI_PHYSICAL_ADDRESS TableAddress = 0; - UINT32 TableLength = 0; - ACPI_STATUS Status = AE_OK; - UINT32 i; - - - /* Handle special tables whose addresses are not in RSDT/XSDT */ - - if (ACPI_COMPARE_NAME (Signature, ACPI_RSDP_NAME) || - ACPI_COMPARE_NAME (Signature, ACPI_SIG_RSDT) || - ACPI_COMPARE_NAME (Signature, ACPI_SIG_XSDT) || - ACPI_COMPARE_NAME (Signature, ACPI_SIG_DSDT) || - ACPI_COMPARE_NAME (Signature, ACPI_SIG_FACS)) - { - /* - * Get the appropriate address, either 32-bit or 64-bit. Be very - * careful about the FADT length and validate table addresses. - * Note: The 64-bit addresses have priority. - */ - if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_DSDT)) - { - if ((Gbl_Fadt->Header.Length >= MIN_FADT_FOR_XDSDT) && - Gbl_Fadt->XDsdt) - { - TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Fadt->XDsdt; - } - else if ((Gbl_Fadt->Header.Length >= MIN_FADT_FOR_DSDT) && - Gbl_Fadt->Dsdt) - { - TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Fadt->Dsdt; - } - } - else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_FACS)) - { - if ((Gbl_Fadt->Header.Length >= MIN_FADT_FOR_XFACS) && - Gbl_Fadt->XFacs) - { - TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Fadt->XFacs; - } - else if ((Gbl_Fadt->Header.Length >= MIN_FADT_FOR_FACS) && - Gbl_Fadt->Facs) - { - TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Fadt->Facs; - } - } - else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_XSDT)) - { - if (!Gbl_Revision) - { - return (AE_BAD_SIGNATURE); - } - TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Rsdp.XsdtPhysicalAddress; - } - else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_RSDT)) - { - TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_Rsdp.RsdtPhysicalAddress; - } - else - { - TableAddress = (ACPI_PHYSICAL_ADDRESS) Gbl_RsdpAddress; - Signature = ACPI_SIG_RSDP; - } - - /* Now we can get the requested special table */ - - Status = OslMapTable (TableAddress, Signature, &MappedTable); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - - TableLength = ApGetTableLength (MappedTable); - } - else /* Case for a normal ACPI table */ - { - if (OslCanUseXsdt ()) - { - ItemSize = sizeof (UINT64); - TableData = ACPI_CAST8 (Gbl_Xsdt) + sizeof (ACPI_TABLE_HEADER); - NumberOfTables = - (UINT8) ((Gbl_Xsdt->Header.Length - sizeof (ACPI_TABLE_HEADER)) - / ItemSize); - } - else /* Use RSDT if XSDT is not available */ - { - ItemSize = sizeof (UINT32); - TableData = ACPI_CAST8 (Gbl_Rsdt) + sizeof (ACPI_TABLE_HEADER); - NumberOfTables = - (UINT8) ((Gbl_Rsdt->Header.Length - sizeof (ACPI_TABLE_HEADER)) - / ItemSize); - } - - /* Search RSDT/XSDT for the requested table */ - - for (i = 0; i < NumberOfTables; ++i, TableData += ItemSize) - { - if (OslCanUseXsdt ()) - { - TableAddress = - (ACPI_PHYSICAL_ADDRESS) (*ACPI_CAST64 (TableData)); - } - else - { - TableAddress = - (ACPI_PHYSICAL_ADDRESS) (*ACPI_CAST32 (TableData)); - } - - /* Skip NULL entries in RSDT/XSDT */ - - if (!TableAddress) - { - continue; - } - - Status = OslMapTable (TableAddress, NULL, &MappedTable); - if (ACPI_FAILURE (Status)) - { - return (Status); - } - TableLength = MappedTable->Length; - - /* Does this table match the requested signature? */ - - if (!ACPI_COMPARE_NAME (MappedTable->Signature, Signature)) - { - OslUnmapTable (MappedTable); - MappedTable = NULL; - continue; - } - - /* Match table instance (for SSDT/UEFI tables) */ - - if (CurrentInstance != Instance) - { - OslUnmapTable (MappedTable); - MappedTable = NULL; - CurrentInstance++; - continue; - } - - break; - } - } - - if (!MappedTable) - { - return (AE_LIMIT); - } - - if (TableLength == 0) - { - Status = AE_BAD_HEADER; - goto Exit; - } - - /* Copy table to local buffer and return it */ - - LocalTable = ACPI_ALLOCATE_ZEROED (TableLength); - if (!LocalTable) - { - Status = AE_NO_MEMORY; - goto Exit; - } - - memcpy (LocalTable, MappedTable, TableLength); - *Address = TableAddress; - *Table = LocalTable; - -Exit: - OslUnmapTable (MappedTable); - return (Status); -} - - -/****************************************************************************** - * - * FUNCTION: OslMapTable - * - * PARAMETERS: Address - Address of the table in memory - * Signature - Optional ACPI Signature for desired table. - * Null terminated 4-character string. - * Table - Where a pointer to the mapped table is - * returned - * - * RETURN: Status; Mapped table is returned if AE_OK. - * AE_NOT_FOUND: A valid table was not found at the address - * - * DESCRIPTION: Map entire ACPI table into caller's address space. - * - *****************************************************************************/ - -static ACPI_STATUS -OslMapTable ( - ACPI_SIZE Address, - char *Signature, - ACPI_TABLE_HEADER **Table) -{ - ACPI_TABLE_HEADER *MappedTable; - UINT32 Length; - - - if (!Address) - { - return (AE_BAD_ADDRESS); - } - - /* - * Map the header so we can get the table length. - * Use sizeof (ACPI_TABLE_HEADER) as: - * 1. it is bigger than 24 to include RSDP->Length - * 2. it is smaller than sizeof (ACPI_TABLE_RSDP) - */ - MappedTable = AcpiOsMapMemory (Address, sizeof (ACPI_TABLE_HEADER)); - if (!MappedTable) - { - AcpiLogError ("Could not map table header at 0x%8.8X%8.8X\n", - ACPI_FORMAT_UINT64 (Address)); - return (AE_BAD_ADDRESS); - } - - /* If specified, signature must match */ - - if (Signature) - { - if (ACPI_VALIDATE_RSDP_SIG (Signature)) - { - if (!ACPI_VALIDATE_RSDP_SIG (MappedTable->Signature)) - { - AcpiOsUnmapMemory (MappedTable, sizeof (ACPI_TABLE_HEADER)); - return (AE_BAD_SIGNATURE); - } - } - else if (!ACPI_COMPARE_NAME (Signature, MappedTable->Signature)) - { - AcpiOsUnmapMemory (MappedTable, sizeof (ACPI_TABLE_HEADER)); - return (AE_BAD_SIGNATURE); - } - } - - /* Map the entire table */ - - Length = ApGetTableLength (MappedTable); - AcpiOsUnmapMemory (MappedTable, sizeof (ACPI_TABLE_HEADER)); - if (Length == 0) - { - return (AE_BAD_HEADER); - } - - MappedTable = AcpiOsMapMemory (Address, Length); - if (!MappedTable) - { - AcpiLogError ("Could not map table at 0x%8.8X%8.8X length %8.8X\n", - ACPI_FORMAT_UINT64 (Address), Length); - return (AE_INVALID_TABLE_LENGTH); - } - - (void) ApIsValidChecksum (MappedTable); - - *Table = MappedTable; - return (AE_OK); -} - - -/****************************************************************************** - * - * FUNCTION: OslUnmapTable - * - * PARAMETERS: Table - A pointer to the mapped table - * - * RETURN: None - * - * DESCRIPTION: Unmap entire ACPI table. - * - *****************************************************************************/ - -static void -OslUnmapTable ( - ACPI_TABLE_HEADER *Table) -{ - if (Table) - { - AcpiOsUnmapMemory (Table, ApGetTableLength (Table)); - } -} diff --git a/source/os_specific/service_layers/osefixf.c b/source/os_specific/service_layers/osefixf.c deleted file mode 100644 index 091c0eae6322..000000000000 --- a/source/os_specific/service_layers/osefixf.c +++ /dev/null @@ -1,1091 +0,0 @@ -/****************************************************************************** - * - * Module Name: osefixf - EFI OSL interfaces - * - *****************************************************************************/ - -/* - * Copyright (C) 2000 - 2016, Intel Corp. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions, and the following disclaimer, - * without modification. - * 2. Redistributions in binary form must reproduce at minimum a disclaimer - * substantially similar to the "NO WARRANTY" disclaimer below - * ("Disclaimer") and any redistribution must be conditioned upon - * including a substantially similar Disclaimer requirement for further - * binary redistribution. - * 3. Neither the names of the above-listed copyright holders nor the names - * of any contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * Alternatively, this software may be distributed under the terms of the - * GNU General Public License ("GPL") version 2 as published by the Free - * Software Foundation. - * - * NO WARRANTY - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - */ - -#include "acpi.h" -#include "accommon.h" -#include "acapps.h" - -#define _COMPONENT ACPI_OS_SERVICES - ACPI_MODULE_NAME ("osefixf") - - -/* Local definitions */ - -#define ACPI_EFI_PRINT_LENGTH 256 - - -/* Local prototypes */ - -static ACPI_STATUS -AcpiEfiArgify ( - char *String, - int *ArgcPtr, - char ***ArgvPtr); - -static BOOLEAN -AcpiEfiCompareGuid ( - EFI_GUID *Guid1, - EFI_GUID *Guid2); - -static ACPI_STATUS -AcpiEfiConvertArgcv ( - CHAR16 *LoadOpt, - UINT32 LoadOptSize, - int *ArgcPtr, - char ***ArgvPtr, - char **BufferPtr); - -static ACPI_PHYSICAL_ADDRESS -AcpiEfiGetRsdpViaGuid ( - EFI_GUID *Guid); - -static CHAR16 * -AcpiEfiFlushFile ( - ACPI_FILE File, - CHAR16 *Begin, - CHAR16 *End, - CHAR16 *Pos, - BOOLEAN FlushAll); - - -/* Local variables */ - -static EFI_FILE_HANDLE AcpiGbl_EfiCurrentVolume = NULL; -EFI_GUID AcpiGbl_LoadedImageProtocol = LOADED_IMAGE_PROTOCOL; -EFI_GUID AcpiGbl_TextInProtocol = SIMPLE_TEXT_INPUT_PROTOCOL; -EFI_GUID AcpiGbl_TextOutProtocol = SIMPLE_TEXT_OUTPUT_PROTOCOL; -EFI_GUID AcpiGbl_FileSystemProtocol = SIMPLE_FILE_SYSTEM_PROTOCOL; - - -/****************************************************************************** - * - * FUNCTION: AcpiEfiGetRsdpViaGuid - * - * PARAMETERS: Guid1 - GUID to compare - * Guid2 - GUID to compare - * - * RETURN: TRUE if Guid1 == Guid2 - * - * DESCRIPTION: Compares two GUIDs - * - *****************************************************************************/ - -static BOOLEAN -AcpiEfiCompareGuid ( - EFI_GUID *Guid1, - EFI_GUID *Guid2) -{ - INT32 *g1; - INT32 *g2; - INT32 r; - - - g1 = (INT32 *) Guid1; - g2 = (INT32 *) Guid2; - - r = g1[0] - g2[0]; - r |= g1[1] - g2[1]; - r |= g1[2] - g2[2]; - r |= g1[3] - g2[3]; - - return (r ? FALSE : TRUE); -} - - -/****************************************************************************** - * - * FUNCTION: AcpiEfiGetRsdpViaGuid - * - * PARAMETERS: None - * - * RETURN: RSDP address if found - * - * DESCRIPTION: Find RSDP address via EFI using specified GUID. - * - *****************************************************************************/ - -static ACPI_PHYSICAL_ADDRESS -AcpiEfiGetRsdpViaGuid ( - EFI_GUID *Guid) -{ - ACPI_PHYSICAL_ADDRESS Address = 0; - int i; - - - for (i = 0; i < ST->NumberOfTableEntries; i++) - { - if (AcpiEfiCompareGuid (&ST->ConfigurationTable[i].VendorGuid, Guid)) - { - Address = ACPI_PTR_TO_PHYSADDR ( - ST->ConfigurationTable[i].VendorTable); - break; - } - } - - return (Address); -} - - -/****************************************************************************** - * - * FUNCTION: AcpiOsGetRootPointer - * - * PARAMETERS: None - * - * RETURN: RSDP physical address - * - * DESCRIPTION: Gets the ACPI root pointer (RSDP) - * - *****************************************************************************/ - -ACPI_PHYSICAL_ADDRESS -AcpiOsGetRootPointer ( - void) -{ - ACPI_PHYSICAL_ADDRESS Address; - EFI_GUID Guid10 = ACPI_TABLE_GUID; - EFI_GUID Guid20 = ACPI_20_TABLE_GUID; - - - Address = AcpiEfiGetRsdpViaGuid (&Guid20); - if (!Address) - { - Address = AcpiEfiGetRsdpViaGuid (&Guid10); - } - - return (Address); -} - - -/****************************************************************************** - * - * FUNCTION: AcpiOsMapMemory - * - * PARAMETERS: where - Physical address of memory to be mapped - * length - How much memory to map - * - * RETURN: Pointer to mapped memory. Null on error. - * - * DESCRIPTION: Map physical memory into caller's address space - * - *****************************************************************************/ - -void * -AcpiOsMapMemory ( - ACPI_PHYSICAL_ADDRESS where, - ACPI_SIZE length) -{ - - return (ACPI_TO_POINTER ((ACPI_SIZE) where)); -} - - -/****************************************************************************** - * - * FUNCTION: AcpiOsUnmapMemory - * - * PARAMETERS: where - Logical address of memory to be unmapped - * length - How much memory to unmap - * - * RETURN: None - * - * DESCRIPTION: Delete a previously created mapping. Where and Length must - * correspond to a previous mapping exactly. - * - *****************************************************************************/ - -void -AcpiOsUnmapMemory ( - void *where, - ACPI_SIZE length) -{ - - return; -} - - -/****************************************************************************** - * - * FUNCTION: Spinlock interfaces - * - * DESCRIPTION: No-op on single threaded BIOS - * - *****************************************************************************/ - -ACPI_STATUS -AcpiOsCreateLock ( - ACPI_SPINLOCK *OutHandle) -{ - return (AE_OK); -} - -void -AcpiOsDeleteLock ( - ACPI_SPINLOCK Handle) -{ -} - -ACPI_CPU_FLAGS -AcpiOsAcquireLock ( - ACPI_SPINLOCK Handle) -{ - return (0); -} - -void -AcpiOsReleaseLock ( - ACPI_SPINLOCK Handle, - ACPI_CPU_FLAGS Flags) -{ -} - - -/****************************************************************************** - * - * FUNCTION: AcpiOsAllocate - * - * PARAMETERS: Size - Amount to allocate, in bytes - * - * RETURN: Pointer to the new allocation. Null on error. - * - * DESCRIPTION: Allocate memory. Algorithm is dependent on the OS. - * - *****************************************************************************/ - -void * -AcpiOsAllocate ( - ACPI_SIZE Size) -{ - EFI_STATUS EfiStatus; - void *Mem; - - - EfiStatus = uefi_call_wrapper (BS->AllocatePool, 3, - EfiLoaderData, Size, &Mem); - if (EFI_ERROR (EfiStatus)) - { - AcpiLogError ("EFI_BOOT_SERVICES->AllocatePool(EfiLoaderData) failure.\n"); - return (NULL); - } - - return (Mem); -} - - -#ifdef USE_NATIVE_ALLOCATE_ZEROED -/****************************************************************************** - * - * FUNCTION: AcpiOsAllocateZeroed - * - * PARAMETERS: Size - Amount to allocate, in bytes - * - * RETURN: Pointer to the new allocation. Null on error. - * - * DESCRIPTION: Allocate and zero memory. Algorithm is dependent on the OS. - * - *****************************************************************************/ - -void * -AcpiOsAllocateZeroed ( - ACPI_SIZE Size) -{ - void *Mem; - - - Mem = AcpiOsAllocate (Size); - if (Mem) - { - memset (Mem, 0, Size); - } - - return (Mem); -} -#endif - - -/****************************************************************************** - * - * FUNCTION: AcpiOsFree - * - * PARAMETERS: Mem - Pointer to previously allocated memory - * - * RETURN: None - * - * DESCRIPTION: Free memory allocated via AcpiOsAllocate - * - *****************************************************************************/ - -void -AcpiOsFree ( - void *Mem) -{ - - uefi_call_wrapper (BS->FreePool, 1, Mem); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiOsOpenFile - * - * PARAMETERS: Path - File path - * Modes - File operation type - * - * RETURN: File descriptor - * - * DESCRIPTION: Open a file for reading (ACPI_FILE_READING) or/and writing - * (ACPI_FILE_WRITING). - * - ******************************************************************************/ - -ACPI_FILE -AcpiOsOpenFile ( - const char *Path, - UINT8 Modes) -{ - EFI_STATUS EfiStatus = EFI_SUCCESS; - UINT64 OpenModes; - EFI_FILE_HANDLE EfiFile = NULL; - CHAR16 *Path16 = NULL; - CHAR16 *Pos16; - const char *Pos; - INTN Count, i; - - - if (!Path) - { - return (NULL); - } - - /* Convert modes */ - - OpenModes = EFI_FILE_MODE_READ; - if (Modes & ACPI_FILE_WRITING) - { - OpenModes |= (EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE); - } - - /* Allocate path buffer */ - - Count = strlen (Path); - Path16 = ACPI_ALLOCATE_ZEROED ((Count + 1) * sizeof (CHAR16)); - if (!Path16) - { - EfiStatus = EFI_BAD_BUFFER_SIZE; - goto ErrorExit; - } - Pos = Path; - Pos16 = Path16; - while (*Pos == '/' || *Pos == '\\') - { - Pos++; - Count--; - } - for (i = 0; i < Count; i++) - { - if (*Pos == '/') - { - *Pos16++ = '\\'; - Pos++; - } - else - { - *Pos16++ = *Pos++; - } - } - *Pos16 = '\0'; - - EfiStatus = uefi_call_wrapper (AcpiGbl_EfiCurrentVolume->Open, 5, - AcpiGbl_EfiCurrentVolume, &EfiFile, Path16, OpenModes, 0); - if (EFI_ERROR (EfiStatus)) - { - AcpiLogError ("EFI_FILE_HANDLE->Open() failure.\n"); - goto ErrorExit; - } - -ErrorExit: - - if (Path16) - { - ACPI_FREE (Path16); - } - - return ((ACPI_FILE) EfiFile); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiOsCloseFile - * - * PARAMETERS: File - File descriptor - * - * RETURN: None. - * - * DESCRIPTION: Close a file. - * - ******************************************************************************/ - -void -AcpiOsCloseFile ( - ACPI_FILE File) -{ - EFI_FILE_HANDLE EfiFile; - - - if (File == ACPI_FILE_OUT || - File == ACPI_FILE_ERR) - { - return; - } - EfiFile = (EFI_FILE_HANDLE) File; - (void) uefi_call_wrapper (AcpiGbl_EfiCurrentVolume->Close, 1, EfiFile); - - return; -} - - -/******************************************************************************* - * - * FUNCTION: AcpiOsReadFile - * - * PARAMETERS: File - File descriptor - * Buffer - Data buffer - * Size - Data block size - * Count - Number of data blocks - * - * RETURN: Size of successfully read buffer - * - * DESCRIPTION: Read from a file. - * - ******************************************************************************/ - -int -AcpiOsReadFile ( - ACPI_FILE File, - void *Buffer, - ACPI_SIZE Size, - ACPI_SIZE Count) -{ - int Length = -1; - EFI_FILE_HANDLE EfiFile; - UINTN ReadSize; - EFI_STATUS EfiStatus; - - - if (File == ACPI_FILE_OUT || - File == ACPI_FILE_ERR) - { - } - else - { - EfiFile = (EFI_FILE_HANDLE) File; - if (!EfiFile) - { - goto ErrorExit; - } - ReadSize = Size * Count; - - EfiStatus = uefi_call_wrapper (AcpiGbl_EfiCurrentVolume->Read, 3, - EfiFile, &ReadSize, Buffer); - if (EFI_ERROR (EfiStatus)) - { - AcpiLogError ("EFI_FILE_HANDLE->Read() failure.\n"); - goto ErrorExit; - } - Length = ReadSize; - } - -ErrorExit: - - return (Length); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiEfiFlushFile - * - * PARAMETERS: File - File descriptor - * Begin - String with boundary - * End - Boundary of the string - * Pos - Current position - * FlushAll - Whether checking boundary before flushing - * - * RETURN: Updated position - * - * DESCRIPTION: Flush cached buffer to the file. - * - ******************************************************************************/ - -static CHAR16 * -AcpiEfiFlushFile ( - ACPI_FILE File, - CHAR16 *Begin, - CHAR16 *End, - CHAR16 *Pos, - BOOLEAN FlushAll) -{ - - if (FlushAll || Pos >= (End - 1)) - { - *Pos = 0; - uefi_call_wrapper (File->OutputString, 2, File, Begin); - Pos = Begin; - } - - return (Pos); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiOsWriteFile - * - * PARAMETERS: File - File descriptor - * Buffer - Data buffer - * Size - Data block size - * Count - Number of data blocks - * - * RETURN: Size of successfully written buffer - * - * DESCRIPTION: Write to a file. - * - ******************************************************************************/ - -int -AcpiOsWriteFile ( - ACPI_FILE File, - void *Buffer, - ACPI_SIZE Size, - ACPI_SIZE Count) -{ - int Length = -1; - CHAR16 String[ACPI_EFI_PRINT_LENGTH]; - const char *Ascii; - CHAR16 *End; - CHAR16 *Pos; - int i, j; - EFI_FILE_HANDLE EfiFile; - UINTN WriteSize; - EFI_STATUS EfiStatus; - - - if (File == ACPI_FILE_OUT || - File == ACPI_FILE_ERR) - { - Pos = String; - End = String + ACPI_EFI_PRINT_LENGTH - 1; - Ascii = ACPI_CAST_PTR (const char, Buffer); - Length = 0; - - for (j = 0; j < Count; j++) - { - for (i = 0; i < Size; i++) - { - if (*Ascii == '\n') - { - *Pos++ = '\r'; - Pos = AcpiEfiFlushFile (File, String, - End, Pos, FALSE); - } - *Pos++ = *Ascii++; - Length++; - Pos = AcpiEfiFlushFile (File, String, - End, Pos, FALSE); - } - } - Pos = AcpiEfiFlushFile (File, String, End, Pos, TRUE); - } - else - { - EfiFile = (EFI_FILE_HANDLE) File; - if (!EfiFile) - { - goto ErrorExit; - } - WriteSize = Size * Count; - - EfiStatus = uefi_call_wrapper (AcpiGbl_EfiCurrentVolume->Write, 3, - EfiFile, &WriteSize, Buffer); - if (EFI_ERROR (EfiStatus)) - { - AcpiLogError ("EFI_FILE_HANDLE->Write() failure.\n"); - goto ErrorExit; - } - Length = WriteSize; - } - -ErrorExit: - - return (Length); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiOsGetFileOffset - * - * PARAMETERS: File - File descriptor - * - * RETURN: Size of current position - * - * DESCRIPTION: Get current file offset. - * - ******************************************************************************/ - -long -AcpiOsGetFileOffset ( - ACPI_FILE File) -{ - long Offset = -1; - - - return (Offset); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiOsSetFileOffset - * - * PARAMETERS: File - File descriptor - * Offset - File offset - * From - From begin/end of file - * - * RETURN: Status - * - * DESCRIPTION: Set current file offset. - * - ******************************************************************************/ - -ACPI_STATUS -AcpiOsSetFileOffset ( - ACPI_FILE File, - long Offset, - UINT8 From) -{ - - return (AE_SUPPORT); -} - - -/****************************************************************************** - * - * FUNCTION: AcpiOsPrintf - * - * PARAMETERS: Format, ... - Standard printf format - * - * RETURN: None - * - * DESCRIPTION: Formatted output. - * - *****************************************************************************/ - -void ACPI_INTERNAL_VAR_XFACE -AcpiOsPrintf ( - const char *Format, - ...) -{ - va_list Args; - - - va_start (Args, Format); - AcpiOsVprintf (Format, Args); - va_end (Args); -} - - -/****************************************************************************** - * - * FUNCTION: AcpiOsVprintf - * - * PARAMETERS: Format - Standard printf format - * Args - Argument list - * - * RETURN: None - * - * DESCRIPTION: Formatted output with arguments list pointer. - * - *****************************************************************************/ - -void -AcpiOsVprintf ( - const char *Format, - va_list Args) -{ - - (void) AcpiUtFileVprintf (ACPI_FILE_OUT, Format, Args); -} - - -/****************************************************************************** - * - * FUNCTION: AcpiOsInitialize - * - * PARAMETERS: None - * - * RETURN: Status - * - * DESCRIPTION: Initialize this module. - * - *****************************************************************************/ - -ACPI_STATUS -AcpiOsInitialize ( - void) -{ - - return (AE_OK); -} - - -/****************************************************************************** - * - * FUNCTION: AcpiEfiArgify - * - * PARAMETERS: String - Pointer to command line argument strings - * which are seperated with spaces - * ArgcPtr - Return number of the arguments - * ArgvPtr - Return vector of the arguments - * - * RETURN: Status - * - * DESCRIPTION: Convert EFI arguments into C arguments. - * - *****************************************************************************/ - -static ACPI_STATUS -AcpiEfiArgify ( - char *String, - int *ArgcPtr, - char ***ArgvPtr) -{ - char *CopyBuffer; - int MaxArgc = *ArgcPtr; - int Argc = 0; - char **Argv = *ArgvPtr; - char *Arg; - BOOLEAN IsSingleQuote = FALSE; - BOOLEAN IsDoubleQuote = FALSE; - BOOLEAN IsEscape = FALSE; - - - if (String == NULL) - { - return (AE_BAD_PARAMETER); - } - - CopyBuffer = String; - - while (*String != '\0') - { - while (isspace (*String)) - { - *String++ = '\0'; - } - Arg = CopyBuffer; - while (*String != '\0') - { - if (isspace (*String) && - !IsSingleQuote && !IsDoubleQuote && !IsEscape) - { - *Arg++ = '\0'; - String++; - break; - } - if (IsEscape) - { - IsEscape = FALSE; - *Arg++ = *String; - } - else if (*String == '\\') - { - IsEscape = TRUE; - } - else if (IsSingleQuote) - { - if (*String == '\'') - { - IsSingleQuote = FALSE; - *Arg++ = '\0'; - } - else - { - *Arg++ = *String; - } - } - else if (IsDoubleQuote) - { - if (*String == '"') - { - IsDoubleQuote = FALSE; - *Arg = '\0'; - } - else - { - *Arg++ = *String; - } - } - else - { - if (*String == '\'') - { - IsSingleQuote = TRUE; - } - else if (*String == '"') - { - IsDoubleQuote = TRUE; - } - else - { - *Arg++ = *String; - } - } - String++; - } - if (Argv && Argc < MaxArgc) - { - Argv[Argc] = CopyBuffer; - } - Argc++; - CopyBuffer = Arg; - } - if (Argv && Argc < MaxArgc) - { - Argv[Argc] = NULL; - } - - *ArgcPtr = Argc; - *ArgvPtr = Argv; - - return ((MaxArgc < Argc) ? AE_NO_MEMORY : AE_OK); -} - - -/****************************************************************************** - * - * FUNCTION: AcpiEfiConvertArgcv - * - * PARAMETERS: LoadOptions - Pointer to the EFI options buffer, which - * is NULL terminated - * LoadOptionsSize - Size of the EFI options buffer - * ArgcPtr - Return number of the arguments - * ArgvPtr - Return vector of the arguments - * BufferPtr - Buffer to contain the argument strings - * - * RETURN: Status - * - * DESCRIPTION: Convert EFI arguments into C arguments. - * - *****************************************************************************/ - -static ACPI_STATUS -AcpiEfiConvertArgcv ( - CHAR16 *LoadOptions, - UINT32 LoadOptionsSize, - int *ArgcPtr, - char ***ArgvPtr, - char **BufferPtr) -{ - ACPI_STATUS Status = AE_OK; - UINT32 Count = LoadOptionsSize / sizeof (CHAR16); - UINT32 i; - CHAR16 *From; - char *To; - int Argc = 0; - char **Argv = NULL; - char *Buffer; - - - /* Prepare a buffer to contain the argument strings */ - - Buffer = ACPI_ALLOCATE_ZEROED (Count); - if (!Buffer) - { - Status = AE_NO_MEMORY; - goto ErrorExit; - } - -TryAgain: - - /* Extend the argument vector */ - - if (Argv) - { - ACPI_FREE (Argv); - Argv = NULL; - } - if (Argc > 0) - { - Argv = ACPI_ALLOCATE_ZEROED (sizeof (char *) * (Argc + 1)); - if (!Argv) - { - Status = AE_NO_MEMORY; - goto ErrorExit; - } - } - - /* - * Note: As AcpiEfiArgify() will modify the content of the buffer, so - * we need to restore it each time before invoking - * AcpiEfiArgify(). - */ - From = LoadOptions; - To = ACPI_CAST_PTR (char, Buffer); - for (i = 0; i < Count; i++) - { - *To++ = (char) *From++; - } - - /* - * The "Buffer" will contain NULL terminated strings after invoking - * AcpiEfiArgify(). The number of the strings are saved in Argc and the - * pointers of the strings are saved in Argv. - */ - Status = AcpiEfiArgify (Buffer, &Argc, &Argv); - if (ACPI_FAILURE (Status)) - { - if (Status == AE_NO_MEMORY) - { - goto TryAgain; - } - } - -ErrorExit: - - if (ACPI_FAILURE (Status)) - { - ACPI_FREE (Buffer); - ACPI_FREE (Argv); - } - else - { - *ArgcPtr = Argc; - *ArgvPtr = Argv; - *BufferPtr = Buffer; - } - return (Status); -} - - -/****************************************************************************** - * - * FUNCTION: efi_main - * - * PARAMETERS: Image - EFI image handle - * SystemTab - EFI system table - * - * RETURN: EFI Status - * - * DESCRIPTION: Entry point of EFI executable - * - *****************************************************************************/ - -EFI_STATUS -efi_main ( - EFI_HANDLE Image, - EFI_SYSTEM_TABLE *SystemTab) -{ - EFI_LOADED_IMAGE *Info; - EFI_STATUS EfiStatus = EFI_SUCCESS; - ACPI_STATUS Status; - int argc; - char **argv = NULL; - char *OptBuffer = NULL; - EFI_FILE_IO_INTERFACE *Volume = NULL; - - - /* Initialize global variables */ - - ST = SystemTab; - BS = SystemTab->BootServices; - - /* Retrieve image information */ - - EfiStatus = uefi_call_wrapper (BS->HandleProtocol, 3, - Image, &AcpiGbl_LoadedImageProtocol, ACPI_CAST_PTR (VOID, &Info)); - if (EFI_ERROR (EfiStatus)) - { - AcpiLogError ("EFI_BOOT_SERVICES->HandleProtocol(LoadedImageProtocol) failure.\n"); - return (EfiStatus); - } - - EfiStatus = uefi_call_wrapper (BS->HandleProtocol, 3, - Info->DeviceHandle, &AcpiGbl_FileSystemProtocol, (void **) &Volume); - if (EFI_ERROR (EfiStatus)) - { - AcpiLogError ("EFI_BOOT_SERVICES->HandleProtocol(FileSystemProtocol) failure.\n"); - return (EfiStatus); - } - EfiStatus = uefi_call_wrapper (Volume->OpenVolume, 2, - Volume, &AcpiGbl_EfiCurrentVolume); - if (EFI_ERROR (EfiStatus)) - { - AcpiLogError ("EFI_FILE_IO_INTERFACE->OpenVolume() failure.\n"); - return (EfiStatus); - } - - Status = AcpiEfiConvertArgcv (Info->LoadOptions, - Info->LoadOptionsSize, &argc, &argv, &OptBuffer); - if (ACPI_FAILURE (Status)) - { - EfiStatus = EFI_DEVICE_ERROR; - goto ErrorAlloc; - } - - acpi_main (argc, argv); - -ErrorAlloc: - - if (argv) - { - ACPI_FREE (argv); - } - if (OptBuffer) - { - ACPI_FREE (OptBuffer); - } - - return (EfiStatus); -} diff --git a/source/os_specific/service_layers/oslibcfs.c b/source/os_specific/service_layers/oslibcfs.c deleted file mode 100644 index 192354c38153..000000000000 --- a/source/os_specific/service_layers/oslibcfs.c +++ /dev/null @@ -1,258 +0,0 @@ -/****************************************************************************** - * - * Module Name: oslibcfs - C library OSL for file I/O - * - *****************************************************************************/ - -/* - * Copyright (C) 2000 - 2016, Intel Corp. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions, and the following disclaimer, - * without modification. - * 2. Redistributions in binary form must reproduce at minimum a disclaimer - * substantially similar to the "NO WARRANTY" disclaimer below - * ("Disclaimer") and any redistribution must be conditioned upon - * including a substantially similar Disclaimer requirement for further - * binary redistribution. - * 3. Neither the names of the above-listed copyright holders nor the names - * of any contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * Alternatively, this software may be distributed under the terms of the - * GNU General Public License ("GPL") version 2 as published by the Free - * Software Foundation. - * - * NO WARRANTY - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING - * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGES. - */ - -#include "acpi.h" -#include <stdio.h> -#include <stdarg.h> - -#define _COMPONENT ACPI_OS_SERVICES - ACPI_MODULE_NAME ("oslibcfs") - - -/******************************************************************************* - * - * FUNCTION: AcpiOsOpenFile - * - * PARAMETERS: Path - File path - * Modes - File operation type - * - * RETURN: File descriptor. - * - * DESCRIPTION: Open a file for reading (ACPI_FILE_READING) or/and writing - * (ACPI_FILE_WRITING). - * - ******************************************************************************/ - -ACPI_FILE -AcpiOsOpenFile ( - const char *Path, - UINT8 Modes) -{ - ACPI_FILE File; - UINT32 i = 0; - char ModesStr[4]; - - - if (Modes & ACPI_FILE_READING) - { - ModesStr[i++] = 'r'; - } - if (Modes & ACPI_FILE_WRITING) - { - ModesStr[i++] = 'w'; - } - - if (Modes & ACPI_FILE_BINARY) - { - ModesStr[i++] = 'b'; - } - - ModesStr[i++] = '\0'; - - File = fopen (Path, ModesStr); - if (!File) - { - perror ("Could not open file"); - } - - return (File); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiOsCloseFile - * - * PARAMETERS: File - An open file descriptor - * - * RETURN: None. - * - * DESCRIPTION: Close a file opened via AcpiOsOpenFile. - * - ******************************************************************************/ - -void -AcpiOsCloseFile ( - ACPI_FILE File) -{ - - fclose (File); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiOsReadFile - * - * PARAMETERS: File - An open file descriptor - * Buffer - Data buffer - * Size - Data block size - * Count - Number of data blocks - * - * RETURN: Number of bytes actually read. - * - * DESCRIPTION: Read from a file. - * - ******************************************************************************/ - -int -AcpiOsReadFile ( - ACPI_FILE File, - void *Buffer, - ACPI_SIZE Size, - ACPI_SIZE Count) -{ - int Length; - - - Length = fread (Buffer, Size, Count, File); - if (Length < 0) - { - perror ("Error reading file"); - } - - return (Length); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiOsWriteFile - * - * PARAMETERS: File - An open file descriptor - * Buffer - Data buffer - * Size - Data block size - * Count - Number of data blocks - * - * RETURN: Number of bytes actually written. - * - * DESCRIPTION: Write to a file. - * - ******************************************************************************/ - -int -AcpiOsWriteFile ( - ACPI_FILE File, - void *Buffer, - ACPI_SIZE Size, - ACPI_SIZE Count) -{ - int Length; - - - Length = fwrite (Buffer, Size, Count, File); - if (Length < 0) - { - perror ("Error writing file"); - } - - return (Length); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiOsGetFileOffset - * - * PARAMETERS: File - An open file descriptor - * - * RETURN: Current file pointer position. - * - * DESCRIPTION: Get current file offset. - * - ******************************************************************************/ - -long -AcpiOsGetFileOffset ( - ACPI_FILE File) -{ - long Offset; - - - Offset = ftell (File); - return (Offset); -} - - -/******************************************************************************* - * - * FUNCTION: AcpiOsSetFileOffset - * - * PARAMETERS: File - An open file descriptor - * Offset - New file offset - * From - From begin/end of file - * - * RETURN: Status - * - * DESCRIPTION: Set current file offset. - * - ******************************************************************************/ - -ACPI_STATUS -AcpiOsSetFileOffset ( - ACPI_FILE File, - long Offset, - UINT8 From) -{ - int Ret = 0; - - - if (From == ACPI_FILE_BEGIN) - { - Ret = fseek (File, Offset, SEEK_SET); - } - - if (From == ACPI_FILE_END) - { - Ret = fseek (File, Offset, SEEK_END); - } - - if (Ret < 0) - { - return (AE_ERROR); - } - else - { - return (AE_OK); - } -} diff --git a/source/os_specific/service_layers/osunixxf.c b/source/os_specific/service_layers/osunixxf.c index 21ac91d84712..643b02e86a50 100644 --- a/source/os_specific/service_layers/osunixxf.c +++ b/source/os_specific/service_layers/osunixxf.c @@ -64,9 +64,6 @@ ACPI_MODULE_NAME ("osunixxf") -BOOLEAN AcpiGbl_DebugTimeout = FALSE; - - /* Upcalls to AcpiExec */ void diff --git a/source/os_specific/service_layers/oswintbl.c b/source/os_specific/service_layers/oswintbl.c index 4e6e9ded2977..464e92db855c 100644 --- a/source/os_specific/service_layers/oswintbl.c +++ b/source/os_specific/service_layers/oswintbl.c @@ -71,8 +71,8 @@ static char KeyBuffer[LOCAL_BUFFER_SIZE]; static char ErrorBuffer[LOCAL_BUFFER_SIZE]; /* - * Tables supported in the Windows registry. SSDTs are not placed into - * the registry, a limitation. + * Tables supported in the Windows registry. Zero or more SSDTs are assumed to + * follow these tables. */ static char *SupportedTables[] = { @@ -82,9 +82,9 @@ static char *SupportedTables[] = "FACP" }; -/* Max index for table above */ +/* Number of table names for the table above. */ -#define ACPI_OS_MAX_TABLE_INDEX 3 +#define ACPI_OS_NUM_TABLE_ENTRIES 4 /****************************************************************************** @@ -171,14 +171,32 @@ AcpiOsGetTableByIndex ( ACPI_PHYSICAL_ADDRESS *Address) { ACPI_STATUS Status; + char *Signature; - if (Index > ACPI_OS_MAX_TABLE_INDEX) + if (Index < ACPI_OS_NUM_TABLE_ENTRIES) { - return (AE_LIMIT); + Signature = SupportedTables[Index]; + Index = 0; + } + else + { + Signature = ACPI_SIG_SSDT; + Index -= ACPI_OS_NUM_TABLE_ENTRIES; + } + + Status = AcpiOsGetTableByName (Signature, Index, Table, Address); + + if (ACPI_SUCCESS (Status)) + { + *Instance = Index; + } + else if (Status == AE_NOT_FOUND && ACPI_COMPARE_NAME (Signature, ACPI_SIG_SSDT)) + { + /* Treat SSDTs that are not found as invalid index. */ + Status = (AE_LIMIT); } - Status = AcpiOsGetTableByName (SupportedTables[Index], 0, Table, Address); return (Status); } @@ -225,11 +243,9 @@ AcpiOsGetTableByName ( ACPI_STATUS Status = AE_OK; - /* - * Windows has no SSDTs in the registry, so multiple instances are - * not supported. - */ - if (Instance > 0) + /* Multiple instances are only supported for SSDT tables. */ + + if (Instance > 0 && !ACPI_COMPARE_NAME (Signature, ACPI_SIG_SSDT)) { return (AE_LIMIT); } @@ -244,6 +260,28 @@ AcpiOsGetTableByName ( return (AE_BUFFER_OVERFLOW); } + /* + * Windows stores SSDT at SSDT, SSD1, ..., SSD9, SSDA, ..., SSDS, SSDT, + * SSDU, ..., SSDY. If the first (0th) and the 29th tables have the same + * OEM ID, Table ID and Revision, then the 29th entry will overwrite the + * first entry... Let's hope that we do not have that many entries. + */ + if (Instance > 0 && ACPI_COMPARE_NAME (Signature, ACPI_SIG_SSDT)) + { + if (Instance < 10) + { + KeyBuffer[strlen (KeyBuffer) - 1] = '0' + (char) Instance; + } + else if (Instance < 29) + { + KeyBuffer[strlen (KeyBuffer) - 1] = 'A' + (char) (Instance - 10); + } + else + { + return (AE_LIMIT); + } + } + WinStatus = RegOpenKeyEx (HKEY_LOCAL_MACHINE, KeyBuffer, 0L, KEY_READ, &Handle); @@ -265,6 +303,12 @@ AcpiOsGetTableByName ( { Signature = "RSDT"; } + else if (ACPI_COMPARE_NAME (Signature, ACPI_SIG_SSDT)) + { + /* SSDT may not be present on older Windows versions, but it is + * also possible that the index is not found. */ + return (AE_NOT_FOUND); + } else { fprintf (stderr, diff --git a/source/os_specific/service_layers/oswinxf.c b/source/os_specific/service_layers/oswinxf.c index 73af3a87db03..b4fc999c7bef 100644 --- a/source/os_specific/service_layers/oswinxf.c +++ b/source/os_specific/service_layers/oswinxf.c @@ -100,9 +100,6 @@ ACPI_OS_SEMAPHORE_INFO AcpiGbl_Semaphores[ACPI_OS_MAX_SEMAPHORES]; #endif /* ACPI_SINGLE_THREADED */ -BOOLEAN AcpiGbl_DebugTimeout = FALSE; - - /****************************************************************************** * * FUNCTION: AcpiOsTerminate |