summaryrefslogtreecommitdiff
path: root/source/os_specific
diff options
context:
space:
mode:
authorJung-uk Kim <jkim@FreeBSD.org>2016-08-01 21:20:41 +0000
committerJung-uk Kim <jkim@FreeBSD.org>2016-08-01 21:20:41 +0000
commit8bc6ab62dbdb3e8b0d2253e0440f6f58ac9afd3d (patch)
treeb2316b6fda5368bb277671853a71b2a758582b05 /source/os_specific
parent4d46bb7749ef0cf25eb2b25f2d7324023cb754b4 (diff)
downloadsrc-test2-8bc6ab62dbdb3e8b0d2253e0440f6f58ac9afd3d.tar.gz
src-test2-8bc6ab62dbdb3e8b0d2253e0440f6f58ac9afd3d.zip
Notes
Diffstat (limited to 'source/os_specific')
-rw-r--r--source/os_specific/service_layers/osefitbl.c1033
-rw-r--r--source/os_specific/service_layers/osefixf.c1091
-rw-r--r--source/os_specific/service_layers/oslibcfs.c258
-rw-r--r--source/os_specific/service_layers/osunixxf.c3
-rw-r--r--source/os_specific/service_layers/oswintbl.c68
-rw-r--r--source/os_specific/service_layers/oswinxf.c3
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