summaryrefslogtreecommitdiff
path: root/source/os_specific/service_layers/oseficlib.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/os_specific/service_layers/oseficlib.c')
-rw-r--r--source/os_specific/service_layers/oseficlib.c1268
1 files changed, 0 insertions, 1268 deletions
diff --git a/source/os_specific/service_layers/oseficlib.c b/source/os_specific/service_layers/oseficlib.c
deleted file mode 100644
index acc5f7b8d..000000000
--- a/source/os_specific/service_layers/oseficlib.c
+++ /dev/null
@@ -1,1268 +0,0 @@
-/******************************************************************************
- *
- * Module Name: oseficlib - EFI specific CLibrary interfaces
- *
- *****************************************************************************/
-
-/******************************************************************************
- *
- * 1. Copyright Notice
- *
- * Some or all of this work - Copyright (c) 1999 - 2016, Intel Corp.
- * All rights reserved.
- *
- * 2. License
- *
- * 2.1. This is your license from Intel Corp. under its intellectual property
- * rights. You may have additional license terms from the party that provided
- * you this software, covering your right to use that party's intellectual
- * property rights.
- *
- * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
- * copy of the source code appearing in this file ("Covered Code") an
- * irrevocable, perpetual, worldwide license under Intel's copyrights in the
- * base code distributed originally by Intel ("Original Intel Code") to copy,
- * make derivatives, distribute, use and display any portion of the Covered
- * Code in any form, with the right to sublicense such rights; and
- *
- * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
- * license (with the right to sublicense), under only those claims of Intel
- * patents that are infringed by the Original Intel Code, to make, use, sell,
- * offer to sell, and import the Covered Code and derivative works thereof
- * solely to the minimum extent necessary to exercise the above copyright
- * license, and in no event shall the patent license extend to any additions
- * to or modifications of the Original Intel Code. No other license or right
- * is granted directly or by implication, estoppel or otherwise;
- *
- * The above copyright and patent license is granted only if the following
- * conditions are met:
- *
- * 3. Conditions
- *
- * 3.1. Redistribution of Source with Rights to Further Distribute Source.
- * Redistribution of source code of any substantial portion of the Covered
- * Code or modification with rights to further distribute source must include
- * the above Copyright Notice, the above License, this list of Conditions,
- * and the following Disclaimer and Export Compliance provision. In addition,
- * Licensee must cause all Covered Code to which Licensee contributes to
- * contain a file documenting the changes Licensee made to create that Covered
- * Code and the date of any change. Licensee must include in that file the
- * documentation of any changes made by any predecessor Licensee. Licensee
- * must include a prominent statement that the modification is derived,
- * directly or indirectly, from Original Intel Code.
- *
- * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
- * Redistribution of source code of any substantial portion of the Covered
- * Code or modification without rights to further distribute source must
- * include the following Disclaimer and Export Compliance provision in the
- * documentation and/or other materials provided with distribution. In
- * addition, Licensee may not authorize further sublicense of source of any
- * portion of the Covered Code, and must include terms to the effect that the
- * license from Licensee to its licensee is limited to the intellectual
- * property embodied in the software Licensee provides to its licensee, and
- * not to intellectual property embodied in modifications its licensee may
- * make.
- *
- * 3.3. Redistribution of Executable. Redistribution in executable form of any
- * substantial portion of the Covered Code or modification must reproduce the
- * above Copyright Notice, and the following Disclaimer and Export Compliance
- * provision in the documentation and/or other materials provided with the
- * distribution.
- *
- * 3.4. Intel retains all right, title, and interest in and to the Original
- * Intel Code.
- *
- * 3.5. Neither the name Intel nor any other trademark owned or controlled by
- * Intel shall be used in advertising or otherwise to promote the sale, use or
- * other dealings in products derived from or relating to the Covered Code
- * without prior written authorization from Intel.
- *
- * 4. Disclaimer and Export Compliance
- *
- * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
- * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
- * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
- * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
- * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
- * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
- * PARTICULAR PURPOSE.
- *
- * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
- * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
- * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
- * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
- * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
- * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
- * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
- * LIMITED REMEDY.
- *
- * 4.3. Licensee shall not export, either directly or indirectly, any of this
- * software or system incorporating such software without first obtaining any
- * required license or other approval from the U. S. Department of Commerce or
- * any other agency or department of the United States Government. In the
- * event Licensee exports any such software from the United States or
- * re-exports any such software from a foreign destination, Licensee shall
- * ensure that the distribution and export/re-export of the software is in
- * compliance with all laws, regulations, orders, or other restrictions of the
- * U.S. Export Administration Regulations. Licensee agrees that neither it nor
- * any of its subsidiaries will export/re-export any technical data, process,
- * software, or service, directly or indirectly, to any country for which the
- * United States government or any agency thereof requires an export license,
- * other governmental approval, or letter of assurance, without first obtaining
- * such license, approval or letter.
- *
- *****************************************************************************/
-
-#include "acpi.h"
-#include "accommon.h"
-#include "acapps.h"
-
-#define _COMPONENT ACPI_OS_SERVICES
- ACPI_MODULE_NAME ("oseficlib")
-
-
-/* Local definitions */
-
-#define ACPI_EFI_PRINT_LENGTH 256
-
-#define ACPI_EFI_KEY_ESC 0x0000
-#define ACPI_EFI_KEY_BACKSPACE 0x0008
-#define ACPI_EFI_KEY_ENTER 0x000D
-#define ACPI_EFI_KEY_CTRL_C 0x0003
-
-#define ACPI_EFI_ASCII_NULL 0x00
-#define ACPI_EFI_ASCII_DEL 0x7F
-#define ACPI_EFI_ASCII_ESC 0x1B
-#define ACPI_EFI_ASCII_CR '\r'
-#define ACPI_EFI_ASCII_NL '\n'
-
-
-/* Local prototypes */
-
-static int
-AcpiEfiArgify (
- char *String,
- int *ArgcPtr,
- char ***ArgvPtr);
-
-static int
-AcpiEfiConvertArgcv (
- CHAR16 *LoadOpt,
- UINT32 LoadOptSize,
- int *ArgcPtr,
- char ***ArgvPtr,
- char **BufferPtr);
-
-static int
-AcpiEfiGetFileInfo (
- FILE *File,
- ACPI_EFI_FILE_INFO **InfoPtr);
-
-static CHAR16 *
-AcpiEfiFlushFile (
- FILE *File,
- CHAR16 *Begin,
- CHAR16 *End,
- CHAR16 *Pos,
- BOOLEAN FlushAll);
-
-
-/* Local variables */
-
-static ACPI_EFI_FILE_HANDLE AcpiGbl_EfiCurrentVolume = NULL;
-ACPI_EFI_GUID AcpiGbl_LoadedImageProtocol = ACPI_EFI_LOADED_IMAGE_PROTOCOL;
-ACPI_EFI_GUID AcpiGbl_TextInProtocol = ACPI_SIMPLE_TEXT_INPUT_PROTOCOL;
-ACPI_EFI_GUID AcpiGbl_TextOutProtocol = ACPI_SIMPLE_TEXT_OUTPUT_PROTOCOL;
-ACPI_EFI_GUID AcpiGbl_FileSystemProtocol = ACPI_SIMPLE_FILE_SYSTEM_PROTOCOL;
-ACPI_EFI_GUID AcpiGbl_GenericFileInfo = ACPI_EFI_FILE_INFO_ID;
-
-int errno = 0;
-
-
-/*******************************************************************************
- *
- * FUNCTION: fopen
- *
- * PARAMETERS: Path - File path
- * Modes - File operation type
- *
- * RETURN: File descriptor
- *
- * DESCRIPTION: Open a file for reading or/and writing.
- *
- ******************************************************************************/
-
-FILE *
-fopen (
- const char *Path,
- const char *Modes)
-{
- ACPI_EFI_STATUS EfiStatus = ACPI_EFI_SUCCESS;
- UINT64 OpenModes;
- ACPI_EFI_FILE_HANDLE EfiFile = NULL;
- CHAR16 *Path16 = NULL;
- CHAR16 *Pos16;
- const char *Pos;
- INTN Count, i;
- BOOLEAN IsAppend = FALSE;
- FILE *File = NULL;
-
-
- if (!Path)
- {
- errno = EINVAL;
- return (NULL);
- }
-
- /*
- * Convert modes, EFI says the only 2 read/write modes are read-only,
- * read+write. Thus set default mode as read-only.
- */
- OpenModes = ACPI_EFI_FILE_MODE_READ;
- switch (*Modes++)
- {
- case 'r':
-
- break;
-
- case 'w':
-
- OpenModes |= (ACPI_EFI_FILE_MODE_WRITE | ACPI_EFI_FILE_MODE_CREATE);
- break;
-
- case 'a':
-
- OpenModes |= (ACPI_EFI_FILE_MODE_WRITE | ACPI_EFI_FILE_MODE_CREATE);
- IsAppend = TRUE;
- break;
-
- default:
-
- errno = EINVAL;
- return (NULL);
- }
-
- for (; *Modes; Modes++)
- {
- switch (*Modes)
- {
- case '+':
-
- OpenModes |= (ACPI_EFI_FILE_MODE_WRITE | ACPI_EFI_FILE_MODE_CREATE);
- break;
-
- case 'b':
- case 't':
-
- break;
-
- case 'f':
- default:
-
- break;
- }
- }
-
- /* Allocate path buffer */
-
- Count = strlen (Path);
- Path16 = ACPI_ALLOCATE_ZEROED ((Count + 1) * sizeof (CHAR16));
- if (!Path16)
- {
- EfiStatus = ACPI_EFI_BAD_BUFFER_SIZE;
- errno = ENOMEM;
- 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 (ACPI_EFI_ERROR (EfiStatus))
- {
- fprintf (stderr, "EFI_FILE_HANDLE->Open() failure.\n");
- errno = ENOENT;
- goto ErrorExit;
- }
-
- File = (FILE *) EfiFile;
- if (IsAppend)
- {
- fseek (File, 0, SEEK_END);
- }
-
-ErrorExit:
-
- if (Path16)
- {
- ACPI_FREE (Path16);
- }
-
- return (File);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION: fclose
- *
- * PARAMETERS: File - File descriptor
- *
- * RETURN: None.
- *
- * DESCRIPTION: Close a file.
- *
- ******************************************************************************/
-
-void
-fclose (
- FILE *File)
-{
- ACPI_EFI_FILE_HANDLE EfiFile;
-
-
- if (File == stdin || File == stdout ||
- File == stderr)
- {
- return;
- }
- EfiFile = (ACPI_EFI_FILE_HANDLE) File;
- (void) uefi_call_wrapper (AcpiGbl_EfiCurrentVolume->Close, 1, EfiFile);
-
- return;
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION: fgetc
- *
- * PARAMETERS: File - File descriptor
- *
- * RETURN: The character read or EOF on the end of the file or error
- *
- * DESCRIPTION: Read a character from the file.
- *
- ******************************************************************************/
-
-int
-fgetc (
- FILE *File)
-{
- UINT8 Byte;
- int Length;
-
-
- Length = fread (ACPI_CAST_PTR (void, &Byte), 1, 1, File);
- if (Length == 0)
- {
- Length = EOF;
- }
- else if (Length == 1)
- {
- Length = (int) Byte;
- }
-
- return (Length);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION: fputc
- *
- * PARAMETERS: File - File descriptor
- * c - Character byte
- *
- * RETURN: The character written or EOF on the end of the file or error
- *
- * DESCRIPTION: Write a character to the file.
- *
- ******************************************************************************/
-
-int
-fputc (
- FILE *File,
- char c)
-{
- UINT8 Byte = (UINT8) c;
- int Length;
-
-
- Length = fwrite (ACPI_CAST_PTR (void, &Byte), 1, 1, File);
- if (Length == 0)
- {
- Length = EOF;
- }
- else if (Length == 1)
- {
- Length = (int) Byte;
- }
-
- return (Length);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION: fgets
- *
- * PARAMETERS: File - File descriptor
- *
- * RETURN: The string read
- *
- * DESCRIPTION: Read a string from the file.
- *
- ******************************************************************************/
-
-char *
-fgets (
- char *s,
- ACPI_SIZE Size,
- FILE *File)
-{
- ACPI_SIZE ReadBytes = 0;
- int Ret;
-
-
- if (Size <= 1)
- {
- errno = EINVAL;
- return (NULL);
- }
- while (ReadBytes < (Size - 1))
- {
- Ret = fgetc (File);
- if (Ret == EOF)
- {
- if (ReadBytes == 0)
- {
- return (NULL);
- }
- break;
- }
- else if (Ret < 0)
- {
- errno = EIO;
- return (NULL);
- }
- else if (Ret == '\n')
- {
- s[ReadBytes++] = (char) Ret;
- break;
- }
- else
- {
- s[ReadBytes++] = (char) Ret;
- }
- }
-
- s[ReadBytes] = '\0';
- return (s);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION: fread
- *
- * PARAMETERS: Buffer - Data buffer
- * Size - Data block size
- * Count - Number of data blocks
- * File - File descriptor
- *
- * RETURN: Size of successfully read buffer
- *
- * DESCRIPTION: Read from a file.
- *
- ******************************************************************************/
-
-int
-fread (
- void *Buffer,
- ACPI_SIZE Size,
- ACPI_SIZE Count,
- FILE *File)
-{
- int Length = -EINVAL;
- ACPI_EFI_FILE_HANDLE EfiFile;
- ACPI_SIMPLE_INPUT_INTERFACE *In;
- UINTN ReadSize;
- ACPI_EFI_STATUS EfiStatus;
- ACPI_EFI_INPUT_KEY Key;
- ACPI_SIZE Pos = 0;
-
-
- if (!Buffer)
- {
- errno = EINVAL;
- goto ErrorExit;
- }
-
- ReadSize = Size * Count;
-
- if (File == stdout || File == stderr)
- {
- /* Do not support read operations on output console */
- }
- else if (File == stdin)
- {
- In = ACPI_CAST_PTR (ACPI_SIMPLE_INPUT_INTERFACE, File);
-
- while (Pos < ReadSize)
- {
-WaitKey:
- EfiStatus = uefi_call_wrapper (In->ReadKeyStroke, 2, In, &Key);
- if (ACPI_EFI_ERROR (EfiStatus))
- {
- if (EfiStatus == ACPI_EFI_NOT_READY)
- {
- goto WaitKey;
- }
- errno = EIO;
- Length = -EIO;
- fprintf (stderr,
- "SIMPLE_INPUT_INTERFACE->ReadKeyStroke() failure.\n");
- goto ErrorExit;
- }
-
- switch (Key.UnicodeChar)
- {
- case ACPI_EFI_KEY_CTRL_C:
-
- break;
-
- case ACPI_EFI_KEY_ENTER:
-
- *(ACPI_ADD_PTR (UINT8, Buffer, Pos)) = (UINT8) ACPI_EFI_ASCII_CR;
- if (Pos < ReadSize - 1)
- {
- /* Drop CR in case we don't have sufficient buffer */
-
- Pos++;
- }
- *(ACPI_ADD_PTR (UINT8, Buffer, Pos)) = (UINT8) ACPI_EFI_ASCII_NL;
- Pos++;
- break;
-
- case ACPI_EFI_KEY_BACKSPACE:
-
- *(ACPI_ADD_PTR (UINT8, Buffer, Pos)) = (UINT8) ACPI_EFI_ASCII_DEL;
- Pos++;
- break;
-
- case ACPI_EFI_KEY_ESC:
-
- *(ACPI_ADD_PTR (UINT8, Buffer, Pos)) = (UINT8) ACPI_EFI_ASCII_ESC;
- Pos++;
- break;
-
- default:
-
- *(ACPI_ADD_PTR (UINT8, Buffer, Pos)) = (UINT8) Key.UnicodeChar;
- Pos++;
- break;
- }
- }
- Length = Pos;
- }
- else
- {
- EfiFile = (ACPI_EFI_FILE_HANDLE) File;
- if (!EfiFile)
- {
- errno = EINVAL;
- goto ErrorExit;
- }
-
- EfiStatus = uefi_call_wrapper (AcpiGbl_EfiCurrentVolume->Read, 3,
- EfiFile, &ReadSize, Buffer);
- if (ACPI_EFI_ERROR (EfiStatus))
- {
- fprintf (stderr, "EFI_FILE_HANDLE->Read() failure.\n");
- errno = EIO;
- Length = -EIO;
- 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 (
- FILE *File,
- CHAR16 *Begin,
- CHAR16 *End,
- CHAR16 *Pos,
- BOOLEAN FlushAll)
-{
- ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE *Out;
-
-
- if (File == stdout || File == stderr)
- {
- Out = ACPI_CAST_PTR (ACPI_SIMPLE_TEXT_OUTPUT_INTERFACE, File);
-
- if (FlushAll || Pos >= (End - 1))
- {
- *Pos = 0;
- uefi_call_wrapper (Out->OutputString, 2, Out, Begin);
- Pos = Begin;
- }
- }
-
- return (Pos);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION: fwrite
- *
- * PARAMETERS: Buffer - Data buffer
- * Size - Data block size
- * Count - Number of data blocks
- * File - File descriptor
- *
- * RETURN: Size of successfully written buffer
- *
- * DESCRIPTION: Write to a file.
- *
- ******************************************************************************/
-
-int
-fwrite (
- void *Buffer,
- ACPI_SIZE Size,
- ACPI_SIZE Count,
- FILE *File)
-{
- int Length = -EINVAL;
- CHAR16 String[ACPI_EFI_PRINT_LENGTH];
- const char *Ascii;
- CHAR16 *End;
- CHAR16 *Pos;
- int i, j;
- ACPI_EFI_FILE_HANDLE EfiFile;
- UINTN WriteSize;
- ACPI_EFI_STATUS EfiStatus;
-
-
- if (File == stdin)
- {
- /* Do not support write operations on input console */
- }
- else if (File == stdout || File == stderr)
- {
- 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 = (ACPI_EFI_FILE_HANDLE) File;
- if (!EfiFile)
- {
- errno = EINVAL;
- goto ErrorExit;
- }
- WriteSize = Size * Count;
-
- EfiStatus = uefi_call_wrapper (AcpiGbl_EfiCurrentVolume->Write, 3,
- EfiFile, &WriteSize, Buffer);
- if (ACPI_EFI_ERROR (EfiStatus))
- {
- fprintf (stderr, "EFI_FILE_HANDLE->Write() failure.\n");
- errno = EIO;
- goto ErrorExit;
- }
- Length = WriteSize;
- }
-
-ErrorExit:
-
- return (Length);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION: AcpiEfiGetFileInfo
- *
- * PARAMETERS: File - File descriptor
- * InfoPtr - Pointer to contain file information
- *
- * RETURN: Clibrary error code
- *
- * DESCRIPTION: Get file information.
- *
- ******************************************************************************/
-
-static int
-AcpiEfiGetFileInfo (
- FILE *File,
- ACPI_EFI_FILE_INFO **InfoPtr)
-{
- ACPI_EFI_STATUS EfiStatus = ACPI_EFI_BUFFER_TOO_SMALL;
- ACPI_EFI_FILE_INFO *Buffer = NULL;
- UINTN BufferSize = ACPI_EFI_FILE_INFO_SIZE + 200;
- ACPI_EFI_FILE_HANDLE EfiFile;
-
-
- if (!InfoPtr)
- {
- errno = EINVAL;
- return (-EINVAL);
- }
-
- while (EfiStatus == ACPI_EFI_BUFFER_TOO_SMALL)
- {
- EfiFile = ACPI_CAST_PTR (ACPI_EFI_FILE_STRUCT, File);
- Buffer = AcpiOsAllocate (BufferSize);
- if (!Buffer)
- {
- errno = ENOMEM;
- return (-ENOMEM);
- }
- EfiStatus = uefi_call_wrapper (EfiFile->GetInfo, 4, EfiFile,
- &AcpiGbl_GenericFileInfo, &BufferSize, Buffer);
- if (ACPI_EFI_ERROR (EfiStatus))
- {
- AcpiOsFree (Buffer);
- if (EfiStatus != ACPI_EFI_BUFFER_TOO_SMALL)
- {
- errno = EIO;
- return (-EIO);
- }
- }
- }
-
- *InfoPtr = Buffer;
- return (0);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION: ftell
- *
- * PARAMETERS: File - File descriptor
- *
- * RETURN: current position
- *
- * DESCRIPTION: Get current file offset.
- *
- ******************************************************************************/
-
-long
-ftell (
- FILE *File)
-{
- long Offset = -1;
- UINT64 Current;
- ACPI_EFI_STATUS EfiStatus;
- ACPI_EFI_FILE_HANDLE EfiFile;
-
-
- if (File == stdin || File == stdout || File == stderr)
- {
- Offset = 0;
- }
- else
- {
- EfiFile = ACPI_CAST_PTR (ACPI_EFI_FILE_STRUCT, File);
-
- EfiStatus = uefi_call_wrapper (EfiFile->GetPosition, 2,
- EfiFile, &Current);
- if (ACPI_EFI_ERROR (EfiStatus))
- {
- goto ErrorExit;
- }
- else
- {
- Offset = (long) Current;
- }
- }
-
-ErrorExit:
- return (Offset);
-}
-
-
-/*******************************************************************************
- *
- * FUNCTION: fseek
- *
- * PARAMETERS: File - File descriptor
- * Offset - File offset
- * From - From begin/end of file
- *
- * RETURN: Status
- *
- * DESCRIPTION: Set current file offset.
- *
- ******************************************************************************/
-
-int
-fseek (
- FILE *File,
- long Offset,
- int From)
-{
- ACPI_EFI_FILE_INFO *Info;
- int Error;
- ACPI_SIZE Size;
- UINT64 Current;
- ACPI_EFI_STATUS EfiStatus;
- ACPI_EFI_FILE_HANDLE EfiFile;
-
-
- if (File == stdin || File == stdout || File == stderr)
- {
- return (0);
- }
- else
- {
- EfiFile = ACPI_CAST_PTR (ACPI_EFI_FILE_STRUCT, File);
- Error = AcpiEfiGetFileInfo (File, &Info);
- if (Error)
- {
- return (Error);
- }
- Size = Info->FileSize;
- AcpiOsFree (Info);
-
- if (From == SEEK_CUR)
- {
- EfiStatus = uefi_call_wrapper (EfiFile->GetPosition, 2,
- EfiFile, &Current);
- if (ACPI_EFI_ERROR (EfiStatus))
- {
- errno = ERANGE;
- return (-ERANGE);
- }
- Current += Offset;
- }
- else if (From == SEEK_END)
- {
- Current = Size - Offset;
- }
- else
- {
- Current = Offset;
- }
-
- EfiStatus = uefi_call_wrapper (EfiFile->SetPosition, 2,
- EfiFile, Current);
- if (ACPI_EFI_ERROR (EfiStatus))
- {
- errno = ERANGE;
- return (-ERANGE);
- }
- }
-
- return (0);
-}
-
-
-/******************************************************************************
- *
- * 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: Clibraray error code
- * -EINVAL: invalid parameter
- * EAGAIN: try again
- *
- * DESCRIPTION: Convert EFI arguments into C arguments.
- *
- *****************************************************************************/
-
-static int
-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)
- {
- errno = EINVAL;
- return (-EINVAL);
- }
-
- 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;
-
- if (MaxArgc < Argc)
- {
- errno = EAGAIN;
- return (-ENOMEM);
- }
- return (0);
-}
-
-
-/******************************************************************************
- *
- * 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: Clibrary error code
- *
- * DESCRIPTION: Convert EFI arguments into C arguments.
- *
- *****************************************************************************/
-
-static int
-AcpiEfiConvertArgcv (
- CHAR16 *LoadOptions,
- UINT32 LoadOptionsSize,
- int *ArgcPtr,
- char ***ArgvPtr,
- char **BufferPtr)
-{
- int Error = 0;
- 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)
- {
- errno = ENOMEM;
- Error = -ENOMEM;
- 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)
- {
- errno = ENOMEM;
- Error = -ENOMEM;
- 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.
- */
- Error = AcpiEfiArgify (Buffer, &Argc, &Argv);
- if (Error && errno == EAGAIN)
- {
- goto TryAgain;
- }
-
-ErrorExit:
-
- if (Error)
- {
- ACPI_FREE (Buffer);
- ACPI_FREE (Argv);
- }
- else
- {
- *ArgcPtr = Argc;
- *ArgvPtr = Argv;
- *BufferPtr = Buffer;
- }
- return (Error);
-}
-
-
-/******************************************************************************
- *
- * FUNCTION: efi_main
- *
- * PARAMETERS: Image - EFI image handle
- * SystemTab - EFI system table
- *
- * RETURN: EFI Status
- *
- * DESCRIPTION: Entry point of EFI executable
- *
- *****************************************************************************/
-
-ACPI_EFI_STATUS
-efi_main (
- ACPI_EFI_HANDLE Image,
- ACPI_EFI_SYSTEM_TABLE *SystemTab)
-{
- ACPI_EFI_LOADED_IMAGE *Info;
- ACPI_EFI_STATUS EfiStatus = ACPI_EFI_SUCCESS;
- int Error;
- int argc;
- char **argv = NULL;
- char *OptBuffer = NULL;
- ACPI_EFI_FILE_IO_INTERFACE *Volume = NULL;
-
-
- /* Initialize global variables */
-
- ST = SystemTab;
- BS = SystemTab->BootServices;
- RT = SystemTab->RuntimeServices;
-
- /* Disable the platform watchdog timer if we go interactive */
-
- uefi_call_wrapper(BS->SetWatchdogTimer, 4, 0, 0x0, 0, NULL);
-
- /* Retrieve image information */
-
- EfiStatus = uefi_call_wrapper (BS->HandleProtocol, 3,
- Image, &AcpiGbl_LoadedImageProtocol, ACPI_CAST_PTR (VOID, &Info));
- if (ACPI_EFI_ERROR (EfiStatus))
- {
- fprintf (stderr,
- "EFI_BOOT_SERVICES->HandleProtocol(LoadedImageProtocol) failure.\n");
- return (EfiStatus);
- }
-
- EfiStatus = uefi_call_wrapper (BS->HandleProtocol, 3,
- Info->DeviceHandle, &AcpiGbl_FileSystemProtocol, (void **) &Volume);
- if (ACPI_EFI_ERROR (EfiStatus))
- {
- fprintf (stderr,
- "EFI_BOOT_SERVICES->HandleProtocol(FileSystemProtocol) failure.\n");
- return (EfiStatus);
- }
- EfiStatus = uefi_call_wrapper (Volume->OpenVolume, 2,
- Volume, &AcpiGbl_EfiCurrentVolume);
- if (ACPI_EFI_ERROR (EfiStatus))
- {
- fprintf (stderr, "EFI_FILE_IO_INTERFACE->OpenVolume() failure.\n");
- return (EfiStatus);
- }
-
- Error = AcpiEfiConvertArgcv (Info->LoadOptions,
- Info->LoadOptionsSize, &argc, &argv, &OptBuffer);
- if (Error)
- {
- EfiStatus = ACPI_EFI_DEVICE_ERROR;
- goto ErrorAlloc;
- }
-
- acpi_main (argc, argv);
-
-ErrorAlloc:
-
- if (argv)
- {
- ACPI_FREE (argv);
- }
- if (OptBuffer)
- {
- ACPI_FREE (OptBuffer);
- }
-
- return (EfiStatus);
-}
-
-#ifdef _EDK2_EFI
-struct _ACPI_EFI_SYSTEM_TABLE *ST;
-struct _ACPI_EFI_BOOT_SERVICES *BS;
-struct _ACPI_EFI_RUNTIME_SERVICES *RT;
-
-EFI_STATUS
-EFIAPI
-UefiMain (
- EFI_HANDLE Image,
- EFI_SYSTEM_TABLE *SystemTab)
-{
- EFI_STATUS EfiStatus;
-
-
- EfiStatus = (EFI_STATUS) efi_main (
- (ACPI_EFI_HANDLE) Image, (ACPI_EFI_SYSTEM_TABLE *) SystemTab);
- return (EfiStatus);
-}
-#endif