summaryrefslogtreecommitdiff
path: root/EmbeddedPkg/EblExternCmd/EntryPointGlue.c
diff options
context:
space:
mode:
Diffstat (limited to 'EmbeddedPkg/EblExternCmd/EntryPointGlue.c')
-rw-r--r--EmbeddedPkg/EblExternCmd/EntryPointGlue.c152
1 files changed, 152 insertions, 0 deletions
diff --git a/EmbeddedPkg/EblExternCmd/EntryPointGlue.c b/EmbeddedPkg/EblExternCmd/EntryPointGlue.c
new file mode 100644
index 0000000000..1e26fb5159
--- /dev/null
+++ b/EmbeddedPkg/EblExternCmd/EntryPointGlue.c
@@ -0,0 +1,152 @@
+/** @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<BR>
+ Portions copyright (c) 2008-2009, Apple Inc. All rights reserved.
+
+ All rights reserved. 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.
+
+
+**/
+
+#define CMD_SEPERATOR ';'
+#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 seperators 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_SEPERATOR allows mult commands on a single line
+ InQuote = FALSE;
+ LookingForArg = TRUE;
+ for (Char = CmdLine, Arg = 0, Index = 0; *Char != '\0' && *Char != CMD_SEPERATOR; Char++, Index++) {
+ // Perform any text coversion here
+ if (*Char == '\t') {
+ // TAB to space
+ *Char = ' ';
+ }
+
+ if (LookingForArg) {
+ // Look for the beging 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_SEPERATOR) {
+ // Replace the command delimeter with null
+ *Char = '\0';
+ }
+
+ return;
+}
+
+
+
+
+/**
+ Embedded Boot Loader (EBL) - A simple EFI command line application for embedded
+ devices. PcdEmbeddedAutomaticBootCommand is a complied in commnad line that
+ gets executed automatically. The ; seperator allows multiple commands
+ for each command line.
+
+ @param ImageHandle EFI ImageHandle for this application.
+ @param SystemTable EFI system table
+
+ @return EFI status of the applicaiton
+
+**/
+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);
+}
+
+