From: David Decotigny <decot@googlers.com>
Date: Thu, 31 Jul 2014 13:42:23 -0700 Subject: [PATCH 4/4] Use Shell protocols to retrieve argc/argv, when available. New header files efishellintf.h efishellparm.h are coming from EDK II, initial location and license at top of files. Only modifications: - efishellintf.h: s/EFI_FILE_PROTOCOL/EFI_FILE/ + expand BITx macros (1<<x) - efishellparm.h: typedef VOID *SHELL_FILE_HANDLE to avoid including ShellBase.h - both: removed extern EFI_GUID variable decls This also adds apps/t8.c, a simple demo. Signed-off-by: David Decotigny <decot@googlers.com> Signed-off-by: Nigel Croxon <nigel.croxon@hp.com>
This commit is contained in:
parent
a61fa058e9
commit
f42974dd9a
@ -61,7 +61,7 @@ LOADLIBES += -T $(LDSCRIPT)
|
|||||||
FORMAT = efi-app-$(ARCH)
|
FORMAT = efi-app-$(ARCH)
|
||||||
|
|
||||||
TARGET_APPS = t.efi t2.efi t3.efi t4.efi t5.efi t6.efi \
|
TARGET_APPS = t.efi t2.efi t3.efi t4.efi t5.efi t6.efi \
|
||||||
printenv.efi t7.efi tcc.efi modelist.efi \
|
printenv.efi t7.efi t8.efi tcc.efi modelist.efi \
|
||||||
route80h.efi drv0_use.efi AllocPages.efi \
|
route80h.efi drv0_use.efi AllocPages.efi \
|
||||||
FreePages.efi
|
FreePages.efi
|
||||||
TARGET_BSDRIVERS = drv0.efi
|
TARGET_BSDRIVERS = drv0.efi
|
||||||
|
19
gnu-efi-3.0/apps/t8.c
Normal file
19
gnu-efi-3.0/apps/t8.c
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#include <efi.h>
|
||||||
|
#include <efilib.h>
|
||||||
|
|
||||||
|
EFI_STATUS
|
||||||
|
efi_main (EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
|
||||||
|
{
|
||||||
|
INTN Argc, i;
|
||||||
|
CHAR16 **Argv;
|
||||||
|
|
||||||
|
InitializeLib(ImageHandle, SystemTable);
|
||||||
|
Argc = GetShellArgcArgv(ImageHandle, &Argv);
|
||||||
|
|
||||||
|
Print(L"Hello World, started with Argc=%d\n", Argc);
|
||||||
|
for (i = 0 ; i < Argc ; ++i)
|
||||||
|
Print(L" Argv[%d] = '%s'\n", i, Argv[i]);
|
||||||
|
|
||||||
|
Print(L"Bye.\n");
|
||||||
|
return EFI_SUCCESS;
|
||||||
|
}
|
94
gnu-efi-3.0/inc/efishellintf.h
Normal file
94
gnu-efi-3.0/inc/efishellintf.h
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
/** @file
|
||||||
|
SHELL_INTERFACE_PROTOCOL from EDK shell (no spec).
|
||||||
|
|
||||||
|
Shell Interface - additional information (over image_info) provided
|
||||||
|
to an application started by the shell.
|
||||||
|
|
||||||
|
ConIo provides a file-style interface to the console.
|
||||||
|
|
||||||
|
The shell interface's and data (including ConIo) are only valid during
|
||||||
|
the applications Entry Point. Once the application returns from it's
|
||||||
|
entry point the data is freed by the invoking shell.
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2010, Intel Corporation. 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
/*
|
||||||
|
* This is based on ShellPkg/Include/Protocol/EfiShellInterface.h from EDK II.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _SHELLINTERFACE_H_
|
||||||
|
#define _SHELLINTERFACE_H_
|
||||||
|
|
||||||
|
|
||||||
|
#define SHELL_INTERFACE_PROTOCOL_GUID \
|
||||||
|
{ \
|
||||||
|
0x47c7b223, 0xc42a, 0x11d2, {0x8e, 0x57, 0x0, 0xa0, 0xc9, 0x69, 0x72, 0x3b} \
|
||||||
|
}
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Bit definitions for EFI_SHELL_ARG_INFO
|
||||||
|
///
|
||||||
|
typedef enum {
|
||||||
|
ARG_NO_ATTRIB = 0x0,
|
||||||
|
ARG_IS_QUOTED = 1<<0,
|
||||||
|
ARG_PARTIALLY_QUOTED = 1<<1,
|
||||||
|
ARG_FIRST_HALF_QUOTED = 1<<2,
|
||||||
|
ARG_FIRST_CHAR_IS_ESC = 1<<3
|
||||||
|
} EFI_SHELL_ARG_INFO_TYPES;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Attributes for an argument.
|
||||||
|
///
|
||||||
|
typedef struct _EFI_SHELL_ARG_INFO {
|
||||||
|
UINT32 Attributes;
|
||||||
|
} EFI_SHELL_ARG_INFO;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// This protocol provides access to additional information about a shell application.
|
||||||
|
///
|
||||||
|
typedef struct {
|
||||||
|
///
|
||||||
|
/// Handle back to original image handle & image information.
|
||||||
|
///
|
||||||
|
EFI_HANDLE ImageHandle;
|
||||||
|
EFI_LOADED_IMAGE *Info;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Parsed arg list converted more C-like format.
|
||||||
|
///
|
||||||
|
CHAR16 **Argv;
|
||||||
|
UINTN Argc;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Storage for file redirection args after parsing.
|
||||||
|
///
|
||||||
|
CHAR16 **RedirArgv;
|
||||||
|
UINTN RedirArgc;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// A file style handle for console io.
|
||||||
|
///
|
||||||
|
EFI_FILE *StdIn;
|
||||||
|
EFI_FILE *StdOut;
|
||||||
|
EFI_FILE *StdErr;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// List of attributes for each argument.
|
||||||
|
///
|
||||||
|
EFI_SHELL_ARG_INFO *ArgInfo;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// Whether we are echoing.
|
||||||
|
///
|
||||||
|
BOOLEAN EchoOn;
|
||||||
|
} EFI_SHELL_INTERFACE;
|
||||||
|
|
||||||
|
#endif
|
63
gnu-efi-3.0/inc/efishellparm.h
Normal file
63
gnu-efi-3.0/inc/efishellparm.h
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/** @file
|
||||||
|
EFI_SHELL_PARAMETERS_PROTOCOL as defined in the UEFI Shell 2.0 specification.
|
||||||
|
|
||||||
|
Copyright (c) 2006 - 2011, Intel Corporation. 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.
|
||||||
|
|
||||||
|
**/
|
||||||
|
/*
|
||||||
|
* This is based on ShellPkg/Include/Protocol/EfiShellParameters.h from EDK II.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __EFI_SHELL_PARAMETERS_PROTOCOL__
|
||||||
|
#define __EFI_SHELL_PARAMETERS_PROTOCOL__
|
||||||
|
|
||||||
|
|
||||||
|
// EDK2's ShellBase.h
|
||||||
|
typedef VOID *SHELL_FILE_HANDLE;
|
||||||
|
|
||||||
|
#define EFI_SHELL_PARAMETERS_PROTOCOL_GUID \
|
||||||
|
{ \
|
||||||
|
0x752f3136, 0x4e16, 0x4fdc, { 0xa2, 0x2a, 0xe5, 0xf4, 0x68, 0x12, 0xf4, 0xca } \
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct _EFI_SHELL_PARAMETERS_PROTOCOL {
|
||||||
|
///
|
||||||
|
/// Points to an Argc-element array of points to NULL-terminated strings containing
|
||||||
|
/// the command-line parameters. The first entry in the array is always the full file
|
||||||
|
/// path of the executable. Any quotation marks that were used to preserve
|
||||||
|
/// whitespace have been removed.
|
||||||
|
///
|
||||||
|
CHAR16 **Argv;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// The number of elements in the Argv array.
|
||||||
|
///
|
||||||
|
UINTN Argc;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// The file handle for the standard input for this executable. This may be different
|
||||||
|
/// from the ConInHandle in EFI_SYSTEM_TABLE.
|
||||||
|
///
|
||||||
|
SHELL_FILE_HANDLE StdIn;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// The file handle for the standard output for this executable. This may be different
|
||||||
|
/// from the ConOutHandle in EFI_SYSTEM_TABLE.
|
||||||
|
///
|
||||||
|
SHELL_FILE_HANDLE StdOut;
|
||||||
|
|
||||||
|
///
|
||||||
|
/// The file handle for the standard error output for this executable. This may be
|
||||||
|
/// different from the StdErrHandle in EFI_SYSTEM_TABLE.
|
||||||
|
///
|
||||||
|
SHELL_FILE_HANDLE StdErr;
|
||||||
|
} EFI_SHELL_PARAMETERS_PROTOCOL;
|
||||||
|
|
||||||
|
#endif
|
@ -1,5 +1,9 @@
|
|||||||
#include "lib.h"
|
#include "lib.h"
|
||||||
|
|
||||||
|
#include "efiprot.h"
|
||||||
|
#include "efishellintf.h"
|
||||||
|
#include "efishellparm.h"
|
||||||
|
|
||||||
#ifndef MAX_ARGV_CONTENTS_SIZE
|
#ifndef MAX_ARGV_CONTENTS_SIZE
|
||||||
# define MAX_CMDLINE_SIZE 1024
|
# define MAX_CMDLINE_SIZE 1024
|
||||||
#endif
|
#endif
|
||||||
@ -19,8 +23,9 @@
|
|||||||
For safety, we support the trailing \0 without a space before, as
|
For safety, we support the trailing \0 without a space before, as
|
||||||
well as several consecutive spaces (-> several args).
|
well as several consecutive spaces (-> several args).
|
||||||
*/
|
*/
|
||||||
|
static
|
||||||
INTN
|
INTN
|
||||||
GetShellArgcArgv(
|
GetShellArgcArgvFromLoadedImage(
|
||||||
EFI_HANDLE ImageHandle,
|
EFI_HANDLE ImageHandle,
|
||||||
CHAR16 **ResultArgv[]
|
CHAR16 **ResultArgv[]
|
||||||
)
|
)
|
||||||
@ -62,6 +67,55 @@ GetShellArgcArgv(
|
|||||||
if ((*ArgStart != L'\0') && (Argc < MAX_CMDLINE_ARGC))
|
if ((*ArgStart != L'\0') && (Argc < MAX_CMDLINE_ARGC))
|
||||||
Argv[Argc++] = ArgStart;
|
Argv[Argc++] = ArgStart;
|
||||||
|
|
||||||
|
// Print(L"Got argc/argv from loaded image proto\n");
|
||||||
*ResultArgv = Argv;
|
*ResultArgv = Argv;
|
||||||
return Argc;
|
return Argc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INTN GetShellArgcArgv(EFI_HANDLE ImageHandle, CHAR16 **Argv[])
|
||||||
|
{
|
||||||
|
// Code inspired from EDK2's
|
||||||
|
// ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.c (BSD)
|
||||||
|
EFI_STATUS Status;
|
||||||
|
static const EFI_GUID EfiShellParametersProtocolGuid
|
||||||
|
= EFI_SHELL_PARAMETERS_PROTOCOL_GUID;
|
||||||
|
static const EFI_GUID ShellInterfaceProtocolGuid
|
||||||
|
= SHELL_INTERFACE_PROTOCOL_GUID;
|
||||||
|
EFI_SHELL_PARAMETERS_PROTOCOL *EfiShellParametersProtocol = NULL;
|
||||||
|
EFI_SHELL_INTERFACE *EfiShellInterfaceProtocol = NULL;
|
||||||
|
|
||||||
|
Status = uefi_call_wrapper(BS->OpenProtocol, 6,
|
||||||
|
ImageHandle,
|
||||||
|
&EfiShellParametersProtocolGuid,
|
||||||
|
(VOID **)&EfiShellParametersProtocol,
|
||||||
|
ImageHandle,
|
||||||
|
NULL,
|
||||||
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
|
);
|
||||||
|
if (!EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
// use shell 2.0 interface
|
||||||
|
// Print(L"Got argc/argv from shell intf proto\n");
|
||||||
|
*Argv = EfiShellParametersProtocol->Argv;
|
||||||
|
return EfiShellParametersProtocol->Argc;
|
||||||
|
}
|
||||||
|
|
||||||
|
// try to get shell 1.0 interface instead.
|
||||||
|
Status = uefi_call_wrapper(BS->OpenProtocol, 6,
|
||||||
|
ImageHandle,
|
||||||
|
&ShellInterfaceProtocolGuid,
|
||||||
|
(VOID **)&EfiShellInterfaceProtocol,
|
||||||
|
ImageHandle,
|
||||||
|
NULL,
|
||||||
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
|
);
|
||||||
|
if (!EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
// Print(L"Got argc/argv from shell params proto\n");
|
||||||
|
*Argv = EfiShellInterfaceProtocol->Argv;
|
||||||
|
return EfiShellInterfaceProtocol->Argc;
|
||||||
|
}
|
||||||
|
|
||||||
|
// shell 1.0 and 2.0 interfaces failed
|
||||||
|
return GetShellArgcArgvFromLoadedImage(ImageHandle, Argv);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user