| /** @file | |
| Glue code that contains the EFI entry point and converts it to an EBL | |
| ASCII Argc, Argv sytle entry point | |
| Copyright (c) 2007, Intel Corporation. All rights reserved.<BR> | |
| Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> | |
| This program and the accompanying materials | |
| are licensed and made available under the terms and conditions of the BSD License | |
| which accompanies this distribution. The full text of the license may be found at | |
| http://opensource.org/licenses/bsd-license.php | |
| THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, | |
| WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. | |
| **/ | |
| #include "Ebl.h" | |
| #define CMD_SEPARATOR ';' | |
| #define MAX_ARGS 32 | |
| EFI_STATUS | |
| EblMain ( | |
| IN UINTN Argc, | |
| IN CHAR8 **Argv | |
| ); | |
| /// | |
| /// EdkExternCmdEntry() & ParseArguments() convert the standard EFI entry point | |
| /// into Argc, Argv form that calls EblMain(). | |
| /// | |
| /** | |
| Parse the CmdLine and break it up into Argc (arg count) and Argv (array of | |
| pointers to each argument). The Cmd buffer is altered and separators are | |
| converted to string terminators. This allows Argv to point into CmdLine. | |
| A CmdLine can support multiple commands. The next command in the command line | |
| is returned if it exists. | |
| @param CmdLine String to parse for a set of commands | |
| @param CmdLineSize Size of CmdLine in bytes | |
| @param Argc Returns the number of arguments in the CmdLine current command | |
| @param Argv Argc pointers to each string in CmdLine | |
| @return Next Command in the command line or NULL if non exists | |
| **/ | |
| VOID | |
| ParseArguments ( | |
| IN CHAR8 *CmdLine, | |
| IN UINTN CmdLineSize, | |
| OUT UINTN *Argc, | |
| OUT CHAR8 **Argv | |
| ) | |
| { | |
| UINTN Arg; | |
| CHAR8 *Char; | |
| BOOLEAN LookingForArg; | |
| BOOLEAN InQuote; | |
| UINTN Index; | |
| *Argc = 0; | |
| if ((CmdLineSize == 0) || (AsciiStrLen (CmdLine) == 0)) { | |
| // basic error checking failed on the arguments | |
| return; | |
| } | |
| // Walk a single command line. A CMD_SEPARATOR allows multiple commands on a single line | |
| InQuote = FALSE; | |
| LookingForArg = TRUE; | |
| for (Char = CmdLine, Arg = 0, Index = 0; *Char != '\0' && *Char != CMD_SEPARATOR; Char++, Index++) { | |
| // Perform any text conversion here | |
| if (*Char == '\t') { | |
| // TAB to space | |
| *Char = ' '; | |
| } | |
| if (LookingForArg) { | |
| // Look for the beginning of an Argv[] entry | |
| if (*Char == '"') { | |
| Argv[Arg++] = ++Char; | |
| LookingForArg = FALSE; | |
| InQuote = TRUE; | |
| } else if (*Char != ' ') { | |
| Argv[Arg++] = Char; | |
| LookingForArg = FALSE; | |
| } | |
| } else { | |
| // Looking for the terminator of an Argv[] entry | |
| if ((InQuote && (*Char == '"')) || (!InQuote && (*Char == ' '))) { | |
| *Char = '\0'; | |
| LookingForArg = TRUE; | |
| } | |
| } | |
| if ((Arg >= MAX_ARGS) || (Index > CmdLineSize)) { | |
| // Error check buffer and exit since it does not look valid | |
| break; | |
| } | |
| } | |
| *Argc = Arg; | |
| if (*Char == CMD_SEPARATOR) { | |
| // Replace the command delimiter with null | |
| *Char = '\0'; | |
| } | |
| return; | |
| } | |
| /** | |
| Embedded Boot Loader (EBL) - A simple EFI command line application for embedded | |
| devices. PcdEmbeddedAutomaticBootCommand is a complied in command line that | |
| gets executed automatically. The ; separator allows multiple commands | |
| for each command line. | |
| @param ImageHandle EFI ImageHandle for this application. | |
| @param SystemTable EFI system table | |
| @return EFI status of the application | |
| **/ | |
| EFI_STATUS | |
| EFIAPI | |
| EdkExternCmdEntry ( | |
| IN EFI_HANDLE ImageHandle, | |
| IN EFI_SYSTEM_TABLE *SystemTable | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| EFI_LOADED_IMAGE_PROTOCOL *ImageInfo; | |
| UINTN Argc; | |
| CHAR8 *Argv[MAX_ARGS]; | |
| Status = gBS->HandleProtocol (ImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **)&ImageInfo); | |
| if (EFI_ERROR (Status)) { | |
| Argc = 0; | |
| } else { | |
| // Looks like valid commands were passed in. | |
| ParseArguments (ImageInfo->LoadOptions, ImageInfo->LoadOptionsSize, &Argc, Argv); | |
| } | |
| return EblMain (Argc, Argv); | |
| } | |